-
2021-12-14 21:06:44
ffmpeg命令详解(一)
1、命令格式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
global_options:全局选项
input_file_options:输入文件相关的选项
output_file_options:输出文件相关的选项
-i input_url:输入文件,可以有多个输入文件,每个输入文件前都要加“-i”选项
output_url:输出文件2、简述
ffmpeg通过选项 -i读取任意数量的输入“文件”,这里的文件是带双引号,它可以是常规文件、管道、网络流、抓取设备等,并写入任意数量的输出“文件”,输出文件前没有选择,任何不能被解释为选项的字符串都被认为是一个输出文件或者称为url。
原则上ÿ
更多相关内容 -
ffmpeg命令手册及例程(官网)-2021.pdf
2021-12-03 17:43:24ffmpeg最新版命令手册和相关例程详细说明 -
FFMpeg命令大全
2018-06-19 15:37:38FFMpeg命令大全, 详细描述FFMpeg中所包含的命令使用方法 -
linux下安装FFmpeg命令,亲测可用
2019-12-02 15:59:36linux下安装FFmpeg命令,亲测可用,文档里面说明了具体的操作步骤,按上面的操作执行即可安装成功. -
FFmpeg命令大全文档.pdf
2020-07-06 14:57:37FFmpeg命令大全文档 -
Qt调用FFmpeg命令录屏
2019-02-25 21:05:47Windows平台,Qt调用FFmpeg.exe进行录屏。支持操作,开始录屏-暂停-结束录屏。 -
ffmpeg命令集合
2018-07-20 16:37:43ffmpeg命令 -
window下PHP使用ffmpeg命令资源包
2017-08-23 10:34:54window下使用ffmpeg命令资源包,(资源分最小就是1分,本来我不想要资源分的,我有很多了,反正也用不完) -
FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令
2016-11-25 17:44:19FFmpeg For Android (三) 移植main函数到安卓上执行ffmpeg命令 完整源码 执行在安卓上执行ffmpeg命令, 示范了音频剪切和视频格式转换 有了它 你可以做很多有趣的app -
FFmpeg命令.zip
2021-02-24 11:34:11FFmpeg命令.zip -
ffmpeg-commander::hammer_and_wrench:FFmpeg命令生成器Web UI
2021-05-03 14:00:16ffmpeg-commander 一个简单的Web UI,用于生成常见的FFmpeg编码操作。 查看以获取自定义的FFmpeg Docker构建。 为什么? FFmpeg具有许多简单和复杂的选项, FFmpeg可能令人生畏。 我想创建一个简单的界面,以从为... -
ffmpeg命令大全.docx
2020-04-09 20:44:48八大类命令使用,彻底告别格式工厂的图形化界面,速度更快,操作更方便,顺便掌握命令行编解码,推流拉流以及滤镜等使用 -
FFmpeg 命令学习文档
2019-04-25 16:38:03FFmpeg 命令基础学习文档,个人整理汇总,初学者可以下载使用 -
ffmpeg命令
2018-03-22 13:36:45ffmpeg多路视频流合成一路,视频画面水平1:1显示,音频合成 -
1-7 ffmpeg命令大全文档.png
2020-07-13 13:48:481-7 ffmpeg命令大全文档.png -
ffmpeg操作命令大全.pdf
2020-07-13 15:11:59ffmpeg操作命令大全.pdf 命令基本格式及参数 主要参数 视频参数 音频参数 录制 分解与复用 处理原始数据 滤镜 音视频的裁剪与拼接 视频图片转换 -
ffmpeg命令入门
2021-06-11 06:45:06FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源...FFmpeg在提供API的同时,也提供了3个命令:ffplay,ffmpeg,ffprobe,掌握常用的FFmpeg命令对于我们后续使用FFmpeg API做开发是非常有帮助。 -
ffmpeg命令大全
2019-07-04 16:02:32ffmpeg命令大全FFMPEG 目录及作用FFMPEG基本概念FFMPEG 命令基本信息查询命令主要参数视频参数音频参数录制录屏分解与复用滤镜简单滤镜复杂滤镜直播相关 前言 FFMPEG是特别强大的专门用于处理音视频的开源库。你既...
前言
FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。
本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用ffmpeg提供的工具来处理音视频文件。FFMPEG 目录及作用
• libavcodec:提供了一系列编码器的实现。
• libavformat:实现在流协议,容器格式及其本IO访问。
• libavutil:包括了hash器,解码器和各利工具函数。
• libavfilter:提供了各种音视频过滤器。
• libavdevice:提供了访问捕获设备和回放设备的接口。
• libswresample:实现了混音和重采样。
• libswscale:实现了色彩转换和缩放工能。FFMPEG基本概念
在讲解 FFMPEG 命令之前,我们先要介绍一些音视频格式的基要概念。
• 音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
• 容器
我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
• channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。FFMPEG 命令
我们按使用目的可以将 FFMPEG 命令分成以下几类:
• 基本信息查询命令
• 录制
• 分解/复用
• 处理原始数据
• 滤镜
• 切割与合并
• 图/视互转
• 直播相关
除了 FFMPEG 的基本信息查询命令外,其它命令都按下图所示的流程处理音视频。
然后将编码的数据包传送给解码器(除非为数据流选择了流拷贝,请参阅进一步描述)。解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过滤波进一步处理(见下一节)。在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。最后,这些传递给复用器,将编码的数据包写入输出文件。
默认情况下,ffmpeg只包含输入文件中每种类型(视频,音频,字幕)的一个流,并将其添加到每个输出文件中。它根据以下标准挑选每一个的“最佳”:对于视频,它是具有最高分辨率的流,对于音频,它是具有最多channel的流,对于字幕,是第一个字幕流。在相同类型的几个流相等的情况下,选择具有最低索引的流。
您可以通过使用-vn / -an / -sn / -dn选项来禁用某些默认设置。要进行全面的手动控制,请使用-map选项,该选项禁用刚描述的默认设置。
下面我们就来详细介绍一下这些命令。基本信息查询命令
FFMPEG 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:
参数 说明 -version 显示版本。 -formats 显示可用的格式(包括设备)。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用的解码器。 -encoders 显示所有可用的编码器。 -bsfs 显示可用的比特流filter。 -protocols 显示可用的协议。 -filters 显示可用的libavfilter过滤器。 -pix_fmts 显示可用的像素格式。 -sample_fmts 显示可用的采样格式。 -layouts 显示channel名称和标准channel布局。 -colors 显示识别的颜色名称。 接下来介绍的是 FFMPEG 处理音视频时使用的命令格式与参数。
命令基本格式及参数
下面是 FFMPEG 的基本命令格式:ffmpeg [global_options] {[input_file_options] -iinput_url} ... {[output_file_options] output_url} ...
ffmpeg通过 -i选项读取输任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等,并写入任意数量的输出“文件”。
原则上,每个输入/输出“文件”都可以包含任意数量的不同类型的视频流(视频/音频/字幕/附件/数据)。流的数量和/或类型是由容器格式来限制。选择从哪个输入进入到哪个输出将自动完成或使用 -map 选项。
要引用选项中的输入文件,您必须使用它们的索引(从0开始)。例如。第一个输入文件是0,第二个输入文件是1,等等。类似地,文件内的流被它们的索引引用。例如。 2:3是指第三个输入文件中的第四个流。
上面就是 FFMPEG 处理音视频的常用命令,下面是一些常用参数:主要参数
参数 说明 -f fmt(输入/输出) 强制输入或输出文件格式。格式通常是自动检测输入文件,并从输出文件的文件扩展名中猜测出来,所以在大多数情况下这个选项是不需要的。 -iurl(输入) 输入文件的网址 -y(全局参数) 覆盖输出文件而不询问。 -n(全局参数) 不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出。 -c [:stream_specifier] codec(输入/输出,每个流) 选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流。codec 是解码器/编码器的名称或 copy(仅输出)以指示该流不被重新编码。如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT -codec [:stream_specifier]编解码器(输入/输出,每个流) 同 -c -t duration(输入/输出) 当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。当用作输出选项时(在输出url之前),在持续时间到达持续时间之后停止输出。 -ss位置(输入/输出) 当用作输入选项时(在-i之前),在这个输入文件中寻找位置。请注意,在大多数格式中,不可能精确搜索,因此ffmpeg将在位置之前寻找最近的搜索点。当转码和-accurate_seek被启用时(默认),搜索点和位置之间的这个额外的分段将被解码和丢弃。当进行流式复制或使用-noaccurate_seek时,它将被保留。当用作输出选项(在输出url之前)时,解码但丢弃输入,直到时间戳到达位置。 -frames [:stream_specifier] framecount(output,per-stream) 停止在帧计数帧之后写入流。 -filter [:stream_specifier] filtergraph(output,per-stream) 创建由filtergraph指定的过滤器图,并使用它来过滤流。filtergraph是应用于流的filtergraph的描述,并且必须具有相同类型的流的单个输入和单个输出。在过滤器图形中,输入与标签中的标签相关联,标签中的输出与标签相关联。有关filtergraph语法的更多信息,请参阅ffmpeg-filters手册。 视频参数
参数 说明 -vframesnum(输出) 设置要输出的视频帧的数量。对于-frames:v,这是一个过时的别名,您应该使用它。 -r [:stream_specifier] fps(输入/输出,每个流) 设置帧率(Hz值,分数或缩写)。作为输入选项,忽略存储在文件中的任何时间戳,根据速率生成新的时间戳。这与用于-framerate选项不同(它在FFmpeg的旧版本中使用的是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。作为输出选项,复制或丢弃输入帧以实现恒定输出帧频fps。 -s [:stream_specifier]大小(输入/输出,每个流) 设置窗口大小。作为输入选项,这是video_size专用选项的快捷方式,由某些分帧器识别,其帧尺寸未被存储在文件中。作为输出选项,这会将缩放视频过滤器插入到相应过滤器图形的末尾。请直接使用比例过滤器将其插入到开头或其他地方。格式是’wxh’(默认 - 与源相同)。 -aspect [:stream_specifier] 宽高比(输出,每个流) 设置方面指定的视频显示宽高比。aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。如果与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。 -vn(输出) 禁用视频录制。 -vcodec编解码器(输出) 设置视频编解码器。这是-codec:v的别名。 -vffiltergraph(输出) 创建由filtergraph指定的过滤器图,并使用它来过滤流。 音频参数
参数 说明 -aframes(输出) 设置要输出的音频帧的数量。这是-frames:a的一个过时的别名。 -ar [:stream_specifier] freq(输入/输出,每个流) 设置音频采样频率。对于输出流,它默认设置为相应输入流的频率。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。 -ac [:stream_specifier]通道(输入/输出,每个流) 设置音频通道的数量。对于输出流,它默认设置为输入音频通道的数量。对于输入流,此选项仅适用于音频捕获设备和原始分路器,并映射到相应的分路器选件。 -an(输出) 禁用录音。 -acodec编解码器(输入/输出) 设置音频编解码器。这是-codec的别名:a。 -sample_fmt [:stream_specifier] sample_fmt(输出,每个流) 设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。 -affiltergraph(输出) 创建由filtergraph指定的过滤器图,并使用它来过滤流。 了解了这些基本信息后,接下来我们看看 FFMPEG 具体都能干些什么吧。
录制
首先通过下面的命令查看一下 mac 上都有哪些设备。
ffmpeg -f avfoundation -list_devicestrue -i""
录屏
ffmpeg -f avfoundation -i1 -r 30out.yuv
• -f 指定使用avfoundation采集数据。
• -i指定从哪儿采集数据,它是一个文件索引号。在我的MAC上,1代表桌面(可以通过上面的命令查询设备索引号)。
• -r 指定帧率。按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。
注意,桌面的输入对帧率没有要求,所以不用限制桌面的帧率。其实限制了也没用。
录屏+声音ffmpeg-favfoundation-i 1:0-r 29.97-c:vlibx264-crf 0 -c:alibfdk_aac-profile:aaac_he_v2-b:a 32kout.flv
• -i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的"0"代表的声音索相号。
• -c:v与参数 -vcodec一样,表示视频编码器。c 是 codec 的缩写,v 是video的缩写。
• -crf是 x264 的参数。 0 表式无损压缩。
• -c:a与参数 -acodec一样,表示音频编码器。
• -profile 是fdk_aac的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
• -b:a指定音频码率。 b 是 bitrate的缩写, a是 audio的缩与。
录视频ffmpeg -framerate 30 -f avfoundation -i0out.mp4
• -framerate 限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
• -f 指定使用avfoundation采集数据。
• -i指定视频设备的索引号。
视频+音频ffmpeg-framerate 30 -favfoundation-i 0:0out.mp4
录音
ffmpeg-favfoundation-i:0out.wav
录制音频裸数据
ffmpeg-favfoundation-i:0-ar 44100 -fs16leout.pcm
分解与复用
流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。这对于更改容器格式或修改容器级元数据很有用。在这种情况下,上图将简化为:
由于没有解码或编码,速度非常快,没有质量损失。但是,由于许多因素,在某些情况下可能无法正常工作。应用过滤器显然也是不可能的,因为过滤器处理未压缩的数据。
抽取音频流ffmpeg -i input.mp4 -acodeccopy -vnout.aac
• acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
• vn: v 代表视频,n 代表 no 也就是无视频的意思。
抽取视频流ffmpeg -i input.mp4 -vcodeccopy -an out.h264
• vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
• an: a 代表视频,n 代表 no 也就是无音频的意思。
转格式ffmpeg -iout.mp4 -vcodeccopy -acodeccopyout.flv
上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。
音视频合并ffmpeg -iout.h264 -iout.aac -vcodeccopy -acodeccopyout.mp4
处理原始数据
提取YUV数据ffmpeg-iinput.mp4-an-c:vrawvideo-pixel_formatyuv420pout.yuv ffplay-swxhout.yuv
• -c:vrawvideo指定将视频转成原始数据
• -pixel_format yuv420p 指定转换格式为yuv420p
YUV转H264ffmpeg-frawvideo-pix_fmtyuv420p-s 320x240-r 30 -iout.yuv-c:vlibx264-frawvideoout.h264
提取PCM数据
ffmpeg -iout.mp4 -vn -ar44100 -ac 2 -f s16le out.pcm ffplay -ar44100 -ac 2 -f s16le -iout.pcm
PCM转WAV
ffmpeg-fs16be-ar 8000 -ac 2 -acodecpcm_s16be-iinput.rawoutput.wav
滤镜
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链式过滤器形成一个过滤器图形。ffmpeg区分两种类型的过滤器图形:简单和复杂。
简单滤镜
简单的过滤器图是那些只有一个输入和输出,都是相同的类型。在上面的图中,它们可以通过在解码和编码之间插入一个额外的步骤来表示:
简单的filtergraphs配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。一个简单的视频filtergraph可以看起来像这样的例子:
请注意,某些滤镜会更改帧属性,但不会改变帧内容。例如。上例中的fps过滤器会改变帧数,但不会触及帧内容。另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。
复杂滤镜
复杂的过滤器图是那些不能简单描述为应用于一个流的线性处理链的过滤器图。例如,当图形有多个输入和/或输出,或者当输出流类型与输入不同时,就是这种情况。他们可以用下图来表示:
复杂的过滤器图使用-filter_complex选项进行配置。请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。
-lavfi选项等同于-filter_complex。
一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。它的音频对应是amix滤波器。
添加水印ffmpeg -iout.mp4 -vf"movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
• -vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。
删除水印
先通过ffplay找到要删除 LOGO 的位置ffplay -itest.flv -vfdelogo=x=806:y=20:w=70:h=80:show=1
使用delogo滤镜删除 LOGO
ffmpeg -itest.flv -vfdelogo=x=806:y=20:w=70:h=80output.flv
视频缩小一倍
ffmpeg -iout.mp4 -vf scale=iw/2:-1 scale.mp4
• -vf scale 指定使用简单过滤器 scale,iw/2:-1 中的iw指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。
视频裁剪ffmpeg -iVR.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size1280x720 vr_new.mp4
crop 格式:crop=out_w:out_h❌y
• out_w: 输出的宽度。可以使用in_w表式输入视频的宽度。
• out_h: 输出的高度。可以使用in_h表式输入视频的高度。
• x : X坐标
• y : Y坐标
如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。
倍速播放ffmpeg -i out.mp4 -filter_complex"[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map"[v]" -map"[a]" speed2.0.mp4
• -filter_complex复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。
• map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。
对称视频ffmpeg -iout.mp4 -filter_complex"[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
• hflip水平翻转
如果要修改为垂直翻转可以用vflip。
画中画ffmpeg -i out.mp4 -i out1.mp4 -filter_complex"[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map"[out]" -movflagsfaststartnew.mp4
录制画中画
ffmpeg -f avfoundation -i"1" -framerate 30 -f avfoundation -i"0:0"
-r 30 -c:v libx264 -preset ultrafast
-c:alibfdk_aac -profile:a aac_he_v2 -ar44100 -ac 2
-filter_complex"[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]"
-map"[out]" -movflagsfaststart -map1:a b.mp4
多路视频拼接ffmpeg -f avfoundation -i"1" -framerate 30 -f avfoundation -i"0:0" -r 30 -c:v libx264 -preset ultrafast -c:alibfdk_aac -profile:a aac_he_v2 -ar44100 -ac 2 -filter_complex"[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map"[out]" -movflagsfaststart -map1:a c.mp4
音视频的拼接与裁剪
裁剪ffmpeg-iout.mp4-ss 00:00:00-t 10 out1.mp4
• -ss指定裁剪的开始时间,精确到秒
• -t 被裁剪后的时长。
合并
首先创建一个 inputs.txt 文件,文件内容如下:
file ‘1.flv’
file ‘2.flv’
file ‘3.flv’
然后执行下面的命令:ffmpeg-fconcat-iinputs.txt-ccopyoutput.flv
hls切片
ffmpeg-iout.mp4-c:vlibx264-c:alibfdk_aac-strict-2-fhlsout.m3u8
• -strict -2 指明音频使有AAC。
• -f hls转成 m3u8 格式。
视频图片互转
视频转JPEGffmpeg-itest.flv-r 1 -fimage2image-%3d.jpeg
视频转gif
ffmpeg-iout.mp4-ss 00:00:00-t 10 out.gif
图片转视频
ffmpeg-fimage2-iimage-%3d.jpegimages.mp4
直播相关
推流
ffmpeg -re -iout.mp4 -c copy -f flv rtmp://server/live/streamName
拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
转流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
实时推流
ffmpeg -framerate 15 -f avfoundation -i"1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room
ffplay
播放YUV 数据ffplay-pix_fmtnv12-s 192x144 1.yuv
播放YUV中的 Y平面
ffplay -pix_fmt nv21 -s 640x480 -vfextractplanes='y' 1.yuv
-
如何跨平台调用ffmpeg?史上最简单基于JavaCV跨平台执行ffmpeg命令
2021-12-02 09:48:35前言 在此之前,博主写了很多关于如何使用Java...ffmpeg命令与JavaCV方式对比 例如这个转流的简单例子: ffmpeg -i rtmp:/A -f flv -vcodec copy -acodec copy rtmp://B。 ffmpeg命令的JavaCV跨平台等价替换 在JavaCV中前言
在此之前,博主写了很多关于如何使用JavaCV的教程,例如《JavaCV五合一教程合集》《JavaCV入门教程》、《JavaCV实战教程》等等,不一一赘述,这些都是通过JavaCV的跨平台能力调用ffmpeg/opencv/tesserac等库的api。本章,博主将带领小伙伴们认识一个新的“跨平台”调用ffmpeg的方式。
咱们先来看看ffmpeg命令和javacv方式对比。
ffmpeg命令与JavaCV方式对比
例如这个转流的简单例子:
ffmpeg -i rtmp:/A -f flv -vcodec copy -acodec copy rtmp://B
。ffmpeg命令的JavaCV跨平台等价替换
在JavaCV中,这个命令的等价替换代码是:
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("rtmp:/A"); grabber.start(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("rtmp://B"); recorder.setFormat("flv"); recorder.start(grabber.getFormatContext()); for(;;){ recorder.recordPacket(grabber.grabPacket()); }
使用JavaCV方式的优点
借助JavaCV和ffmpeg的api,可以获取每个音/视频帧和图像、音频采样,并可以二次处理后(使用opencv进行人脸检测识别或者添加视频滤镜、音频滤波),再进行推流或者是录制成hls/mp4分片文件等等操作。通过上述对比,大家应该都看出来当然是使用FFmpeg更简单易用。但是ffmpeg本身并不能跨平台,如果要在代码中以跨平台方式执行ffmpeg命令,还需要编译各个平台下和各个指令集的ffmpeg。比如windows平台下需要编译和加载各个指令集(x86、amd64、arm64、armel、armhf、i386、mips、mips64el、mipsel、ppc64el、s390x)的
的ffmpeg.exe。
而想要让ffmpeg在linux各个发行版上跨平台,还需要知道ffmpeg在各个发行版都不通用,需要编译和加载各个发行版(debian、ubuntu、fedora、redhat/centos)下的各个指令集(x86、amd64、arm64、armel、armhf、i386、mips、mips64el、mipsel、ppc64el、s390x。
苹果mac平台就不讲了。那么,有没有更简单的办法能够跨平台调用ffmpeg命令行呢?
如何基于JavaCV跨平台调用ffmpeg命令
在项目中引入JavaCV依赖
maven方式:
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.6</version> </dependency>
gradle方式:
dependencies { implementation group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.6' }
Leiningen方式
:dependencies [ [org.bytedeco/javacv-platform "1.5.6"] ]
sbt方式:
libraryDependencies += "org.bytedeco" % "javacv-platform" % "1.5.6"
基于JavaCV跨平台调用ffmpeg命令
通过
String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
就可以获取JavaCV中的ffmpeg本地库的调用路径。/** * 史上最简单的方式调用javacv中的ffmpeg本地程序 * @author eguid */ public static void main(String[] args){ String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); ProcessBuilder pb = new ProcessBuilder(ffmpeg, "-i", "/path/to/input.mp4", "-vcodec", "h264", "/path/to/output.mp4"); pb.inheritIO().start().waitFor(); }
通过这种方式,就可以不需要编译各个平台(windows/linux各个发行版/安卓/mac/ios)下各个指令集的ffmpeg了。直接借助JavaCV的跨平台性,与原生ffmpeg一样执行各种ffmpeg命令了。
是不是很简单?
如果觉得博主写得还不错,欢迎大家“关注、点赞、收藏”一键三连支持博主原创!!!
-
技术分享| 如何使用FFmpeg命令处理音视频
2021-11-18 11:57:43它既可以使用API对音视频进行处理,也可以使用FFmpeg命令编辑音视频文件。 包含用于音频、视频和字幕流的多个解码器和编码器,以及多个位流过滤器。 FFmpeg目录及其作用 libavutil: 是一个包含用于简化编程的函数...FFmpeg是领先的多媒体框架,是一个强大的处理音视频的开源库,能够解码、编码、转码、混流、流媒体分离、滤镜和播放几乎所有格式的音视频内容。它既可以使用API对音视频进行处理,也可以使用FFmpeg命令编辑音视频文件。
包含用于音频、视频和字幕流的多个解码器和编码器,以及多个位流过滤器。
FFmpeg目录及其作用
libavutil: 是一个包含用于简化编程的函数工具库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。
libavcodec: 是一个包含用于音频/视频编解码器的库。
libavformat: 是一个包含多媒体容器格式的合成器和分离器的库。
libavdevice: 是一个包含输入和输出设备的库,用于抓取和渲染许多常见的多媒体输入/输出软件框架,包括 Video4Linux、Video4Linux2、VfW 和 ALSA。
libavfilter: 是一个包含媒体过滤器的库。
libswscale: 是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。
libswresample: 是一个执行高度优化的音频重采样、rematrixing和样本格式转换操作的库。
FFmpeg工具及其作用
ffmpeg: ffmpeg是一个命令行工具,用于在命令行实现FFmpeg具有的功能。
ffplay: ffplay是一个使用 FFmpeg 库和 SDL 库的非常简单和便携的媒体播放器。它主要用作各种 FFmpeg API 的测试平台。
ffprobe: ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。
经过了解了FFmpeg的目录及其工具,下面文章着重介绍下在日常生活中,我们怎么使用FFmpeg命令行处理音视频文件。
FFmpeg处理音视频功能说明
FFmpeg命令根据功能的区分,大致可以分为:录制命令,音视频的合成和分离,音视频的切割与合并,图片、视频互相转换等几个大的模块。下面我们介绍下如何使用FFmpeg命令行处理音视频实现以上的几个功能。
本文以Ubuntu操作系统为例,通过简单的命令sudo apt-get install ffmpeg来安装。
也可以在Windows,MacOS,其他Linux操作系统安装FFmpeg后执行一下命令。
1)录制
ffmpeg -f avfoundation -list_devices true -i ""
2)录屏
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
- f 指定使用 avfoundation 采集数据。
- -i 指定从哪儿采集数据,它是一个文件索引号。在我的电脑上,1 代表桌面(可以通过上面的命令查询设备索引号)。
- -r 指定帧率。按 ffmpeg 官方文档说-r 与-framerate 作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r 用于限制输出。
3) 录屏+声音
ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 48k out.flv
- -i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的"0"代表的声音索相号。
- -c:v 与参数 -vcodec 一样,表示视频编码器。c 是 codec 的缩写,v 是 video 的缩写。
- -crf 是 x264 的参数。 0 表式无损压缩。
- -c:a 与参数 -acodec 一样,表示音频编码器。
- -profile 是 fdk_aac 的参数。 aac_he_v2 表式使用 AAC_HE v2 压缩数据。
- -b:a 指定音频码率。 b 是 bitrate 的缩写, a 是 audio 的缩与。
4) 录视频
ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4
- -framerate 限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
- -f 指定使用 avfoundation 采集数据。
- -i 指定视频设备的索引号。
5) 视频+音频
ffmpeg -framerate 30 -f avfoundation -i 0:0 out.mp4
6) 录音
ffmpeg -f avfoundation -i :0 out.wav
7) 录制音频裸数据
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm
8) 抽取音频流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
- acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。
- vn: v 代表视频,n 代表 no 也就是无视频的意思。
9) 转换为MP3格式
ffmpeg -i input.mp4 -acodec libmp3lame out.mp3
10) 抽取视频流
ffmpeg -i input.mp4 -vcodec copy -an out.h264
- vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
- an: a 代表视频,n 代表 no 也就是无音频的意思。
11) 视频转格式
ffmpeg -i video_test.mp4 -vcodec copy -acodec copy out_convert.flv
上面的命令表式的音频、视频都直接 copy,只是将 mp4 的封装格式转成了 flv。
12) 去除视频声音
ffmpeg -i video_auido.mp4 -vcodec copy -an video.mp4
13) 视频压缩
1)ffmpeg -i test_ffmpeg.mp4 (压缩的文件更大更清晰,一般情况下不用) 2)ffmpeg -i out.MP4 -b:v 500k 512k_out.mp4(减小视频码率,压缩的更模糊)
14) 音视频合并
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
15) 提取YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv 播放 ffplay -s wxh out.yuv
- -c:v rawvideo 指定将视频转成原始数据
- -pixel_format yuv420p 指定转换格式为 yuv420p
16) 视频YUV转H264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 640x480 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264
17) 提取音频PCM数据
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm 播放 ffplay -ar 44100 -ac 2 -f s16le -i out.pcm
18) PCM转WAV
ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.raw output.wav
19) 添加水印
图片水印:ffmpeg -i out.mp4 -vf "movie=logo.png,scale=128:72[watermask];[in][watermask] overlay=96:54 [out]" water_img.mp4
- -vf 中的 movie 指定 logo 位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。
文字水印:
ffmpeg -i out.mp4 -vf "drawtext=fontfile=FZBaoHTJW_Xi.TTF: text='anyRTC':x=128:y=72:fontsize=24:fontcolor=red:shadowy=2" water_text.mp4
20) 视频缩放
fmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
- -vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。-1表示高度随宽度一起变化。
降低视频的分辨率且转换视频格式
ffmpeg -i input.avi -vf scale=640:360 out.mp4
21) 视频裁剪
ffmpeg -i VR.mov -vf crop=in_w-300:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4
crop 格式:crop=out_w:out_h❌y
- out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。
- out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。
- x : X 坐标
- y : Y 坐标
如果 x 和 y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。
22) 视频左右(上下)翻转
ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
- hflip 水平翻转
- 如果要修改为垂直翻转可以用 vflip
23) 裁剪片段
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out_cut.mp4
- -ss 指定裁剪的开始时间,精确到秒
- -t 被裁剪后的时长。
24) 音视频合并
首先创建一个 videolist.txt 文件,文件内容如下:
file ‘test1.mp4’
file ‘test2.mp4’
然后执行下面的命令:ffmpeg -f concat -i videolist.txt -c copy output.mp4
25) HLS切片
ffmpeg -i out.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8
- -strict -2 指明音频使有 AAC
- -f hls 转成 m3u8 格式
26) 视频转JPEG
ffmpeg -i video_test.mp4 -r 1 -f image2 image-%3d.jpeg
27) 图片格式转换
ffmpeg -i input.bmp out.jpg ffmpeg -i input.bmp out.png
28) 视频按帧截图
主要用于用户手动截图或上传视频生成缩略图此处:-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,-vframes
设置转换多少桢(frame)的视频,示例命令是获取第一秒第一帧的截图。注:生成的截图最好使用jpg格式,占用空间较小,如果需要使用其他格式,根据业务需求自行设置即可。
ffmpeg -ss 00:00:01 -y -i video_test.mp4 -vframes 1 snap.jpg
29) 视频转GIF
ffmpeg -i video_test.mp4 -r 1 -f image2 image-%3d.jpeg
30) 图片转视频
ffmpeg -f image2 -i image-%3d.jpeg out_img_video.mp4
31) 视频添加字幕srt
ffmpeg -i video_test.mp4 -vf subtitles=subtitle.srt out_subtitle.mp4
32) 视频添加音乐+字幕
ffmpeg -i video_test.mp4 -i audio_bg.mp3 -vf subtitles=all_mp3_srt.srt out_mp3_subtitle.mp4
FFmpeg是一个强大的专门音视频处理的库,很多播放器都是基于FFmpeg进行的开发。文章所提的功能只是小编罗列的FFmpeg可使用功能的一部分,更多FFmpeg命令行可实现处理音视频的功能,大家可以去FFmpeg官网查阅相关文档。
-
ffmpeg命令录制windows音视频
2018-09-26 12:03:35ffmpeg命令录制windows音视频 -
FFCommand_Engine:创建和执行FFmpeg命令
2021-05-18 13:10:05基于FFmpeg命令构造,存储和操作。 将FFmpeg命令分解为更易于理解的形式。 允许那些终端经验有限的人轻松使用FFmpeg。 创建FFmpeg进程队列。 无需脚本知识即可批处理文件。 轻松修改在线找到的命令以适应您的... -
node-ffmpeg-stream:Node.js绑定到ffmpeg命令,公开基于流的API
2021-05-02 16:08:43节点绑定到ffmpeg命令,公开基于流的API。 注意: ffmpeg必须已安装并且在PATH可用。 您可以通过FFMPEG_PATH环境变量(默认值为ffmpeg )设置自定义ffmpeg路径。 例子 const { Converter } = require ( "ffmpeg-... -
ffmpeg命令生成工具_一个用于生成FFmpeg命令的简单Web UI
2020-07-29 10:01:26ffmpeg命令生成工具 ffmpeg-commander (ffmpeg-commander) ffmpeg-commander is a simple web UI for generating FFmpeg commands. ffmpeg-commander是用于生成FFmpeg命令的简单Web UI。 View demo 查看演示 View ... -
Android中运行FFMPEG命令.7z
2021-05-28 20:54:06【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 https://hanshuliang.blog.csdn.net/article/details/117373640 博客资源 -
FFCH4J:FFCH4J项目全称:FFmpeg命令处理器(原用名FFmpegComandHandler4java,FFmpeg命令行运行管理器)。...
2021-05-10 16:57:52FFCH4J项目全称:FFmpeg命令处理器,鉴于很多小伙伴们反馈原名太长,改为‘FFCH4J’ 说明 java封装的提供ffmpeg命令执行、停止、查询功能的简单管理器 。 FFCH4j不仅仅只支持ffmpeg命令,还支持执行多平台的命令行... -
ffmpeg命令分析-vf
2022-03-11 17:39:40本系列主要分析各种 ffmpeg 命令 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。 命令如下: ./ffmpeg -i a.mp4 -vf "split[main][tmp];[tmp]crop=iw:ih/2:0:0,vflip[flip];[main][flip]overlay... -
使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法
2020-10-15 14:22:19主要介绍了使用 FFmpeg 命令拼接mp3音频文件异常问题及解决方法,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下 -
音视频FFMPEG命令从入门到提高
2021-06-12 09:11:18FFMPEG在提供API的同时,也提供了3个命令:ffplay,ffmpeg,ffprobe,掌握常用的FFmpeg命令对于我们后续使用FFMPEG API做开发是非常有帮助。学完该课程不敢说精通ffmpeg命令,但日常使用没问题。