来源:https://einverne.github.io/post/2015/12/ffmpeg-first.html#ffmpeg-usage
那天需要将一段视频文件转成 gif,偶遇 ffmpeg,于是就学习了一下,它真的很强大。在看资料的过程中也是挺有趣的,发现其实 kmplayer 以及国内的 QQ 影音,暴风等等,都不同程度的使用了 ffmpeg,可是根据 ffmpeg 的开源许可 LGPL,任何使用 ffmpeg 的软件都必须开源,于是乎 QQ 影音,暴风都上了 ffmpeg 的耻辱柱,如果没接触到 ffmpeg 还真不知道有这一茬,国内的黑心厂商真是拿开源社区的东西都不遵循开源协议。
下面就直接进正题吧:
几个概念
在进入 ffmpeg 入门之前有一些基本概念需要了解,我在查看 ffmpeg 的时候回头查阅了这些资料,觉得先行了解比较好,这些概念都是视频或者音频中的基本概念。
比特率
比特率,英文为 bit rate,描述每秒钟输出多少 KB 的参数,单位是 Kbps,也就是 kbit/s,8Kbit/s = 1KB/s。也就是说 800Kbps 意思就是每秒视频就要占用 100KB 磁盘空间。对于音频文件也存在比特率,同理。压缩同一个视频,视频比特率越大,文件体积越大。视频比特率越大,画质越好,马赛克越少。
MP3 一般使用的比特率为 8~320kbps。
举一个例子:
bitrate 可以理解为 file size / duration
比如一个视频文件 20.8 M 时长为 1min,那么
bitrate = 20.8M bit/60s = 20.8 * 1024 * 1024 * 8 bit/60s = 2831 Kbps假设音频的码率为固定 128 Kbps,那么视频的码率就是
2831 Kbps - 128 Kbps = 2703 KbpsH.264 标准建议
| 视频大小 | 分辨率 | 建议码率 |
|---|---|---|
| 480P | 720X480 | 1800Kbps |
| 720P | 1280X720 | 3500Kbps |
| 1080P | 1920X1080 | 8500Kbps |
可变码率
可变码率叫做 Variable Bitrate (VBR),也叫作动态比特率编码,VBR 指的是编码器的输出码率可以根据编码器输入源信号的复杂度自适应调整,目的是为了达到输出质量保持不变的同时节省存储空间。VBR 适用于存储,不太适用流式传输,可以更有效的地利用有限空间。
固定码率
固定码率叫做 Constant Bitrate (CBR),CBR 指的是编码器输出码率固定,CBR 不适合存储,CBR 对于复杂内容可能没有足够码率进行编码,从而导致质量下降,同时会在简单内容部分浪费一些码率。
帧数
帧数,又被叫做帧率,指的是每秒钟播放的图片数,单位 fps(英文:Frames Per Second),每秒的帧数或者帧率表示视频文件或者图形处理器场景时每秒钟能够更新的次数。
高的帧率可以得到更流畅、更逼真的画面。一般来说 30fps 就是可以接受的,但是将性能提升至 60fps 则可以明显提升交互感和逼真感,但是一般来说超过 75fps 一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为显示器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。
在同一视频,同一码率的情况下,帧数越大,则画质越不好。尤其是运动的画面。因为每张画面会分担每秒有限的文件体积,如果画面越多,那么每张画面所能表现的内容就越有限。
当画面的 FPS 达到 60 帧 / 秒时,已经能满足绝大部分应用需求。一般情况下,如果能够保证游戏画面的平均 FPS 能够达到 30 帧 / 秒,那么画面已经基本流畅;能够达到 50 帧 / 秒,就基本可以体会到行云流水的感觉了。一般人很难分辨出 60 帧 / 秒与 100 帧 / 秒有什么不同。
分辨率
最好理解的概念了,表示画面的大小,单位是像素 px。
和编码率的关系:越高的分辨率,需要越高的编码率,因为图像的细节多了,需要的文件体积也应该增大,否则还不如画面小一些,你会发现同一码率,画面越大,图像的马赛克程度越明显。
采样率
每秒钟对音频信号的采样次数,采样频率越高声音还原度越高,声音更加自然。单位是赫兹 Hz。音频文件一般使用的采样率是 44100 Hz ,也就是一秒钟采样 44100 次,之所以使用这个数值是因为经过了反复实验,人们发现这个采样精度最合适,低于这个值就会有较明显的损失,而高于这个值人的耳朵已经很难分辨,而且增大了数字音频所占用的空间。我们所使用的 CD 的采样标准就是 44.1k,目前 44.1k 还是一个最通行的标准。
安装
Debian/Ubuntu/Linux Mint 下安装 ffmpeg 很简单:
apt-get install ffmpeg其他操作系统安装方法,参考官网
如果想要手工编译 ffmpeg 可以参考官方wiki。 Ubuntu/Debian/Mint 系手工编译 ffmpeg 参考wiki。
用法举例
显示文件信息
显示视频信息
ffmpeg -i input.avi将视频拆分图片 批量截图
将视频拆分多张图片,每一帧图片,保存到 frames 文件夹下,命名 frame001.png 这种。可以加上 -r 参数以用来限制每秒的帧数,-r 10就表示每秒 10 帧。
ffmpeg -i input.mp4 frames/frame%03d.png图片合成视频
将多张图片合成视频
ffmpeg -i frames/frame%3d.png output.mp4从视频中提取音频
从视频文件中提取音频并保存为 mp3
ffmpeg -i input.mp4 -f mp3 output.mp3或
ffmpeg -i input.mp4 -vn output.mp3或
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3说明:
如果需要可以在中间加上-ar 44100 -ac 2 -ab 192系数,表示采样率 44100 ,通道 2 立体声,码率 192 kb/s.
-vn表示不使用视频-ar设置音频采样率-ac设置音频 Channels-ab设置音频比特率 bitrate-f输出文件的格式
将声音合成到视频
将声音合成到视频中
ffmpeg -i input_music.mp3 -i input_video.mp4 output.mp4转化格式
格式之间转换 大部分的情况下直接运行一下即可
ffmpeg -i input.mp4 output.avi将 flv 转码 MP4
ffmpeg -i input.flv -vcodec copy -acodec copy out.mp4-vcodec copy和-acodec copy表示所使用的视频和音频编码格式,为原样拷贝。
转换文件格式
ffmpeg -y -i input_video.mp4 -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp或
ffmpeg -y -i test.wmv -ac 1 -acodec libamr_nb -ar 8000 -ab 12200 -s 176x144 -b 128 -r 15 test.3gp视频切片操作
对视频切片操作
比如需要从视频第 1 分 45 秒地方,剪 10 秒画面,-ss 表示开始位置,-t 表示延长时间
ffmpeg -ss 00:01:45 -i input.mp4 -t 10 output.mp4加速减速视频
加速视频
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4同理减速视频
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" output.mp4此操作对音频无影响
视频截图
视频 10 秒的地方 (-ss参数)截取一张 1920x1080 尺寸大小的,格式为 jpg 的图片-ss后跟的时间单位为秒
ffmpeg -ss 10 -i input_video.mp4 -y -f image2 -t 0.001 -s 1920x1080 output.jpg或者
ffmpeg -ss 00:00:06.000 -i input_video.mp4 -vframes 1 output.png合成 gif
把视频的前 30 帧转换成一个 Gif
ffmpeg -i input_video.mp4 -vframes 30 -y -f gif output.gif将视频转成 gif
ffmpeg -ss 00:00:00.000 -i input.mp4 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif将输入的文件从 (-ss) 设定的时间开始以 10 帧频率,输出到 320x240 大小的 gif 中,时间长度为 -t 设定的参数。通过这样转换出来的 gif 一般都比较大,可以使用ImageMagick来优化图片的大小。
convert -layers Optimize output.gif output_optimized.gif把 frame.[001-100].jpg 序列帧和 bg.mp3 音频文件利用 mpeg4 编码方式合成分辨率 720p 的视频文件 output.avi:
ffmpeg -i bg.mp3 -i frame.%3d.jpg -s hd720 -vcodec mpeg4 output.avi转换码率
ffmpeg 码率相关的参数主要有-minrate,maxrate,-b:v
ffmpeg -i input.mp4 -b:v 2000k output.mp4也就是把原始视频转换成 2 Mbps 码率视频。ffmpeg 官方建议,在设置-b:v时,同时加上-bufsize用于设置码率控制缓冲器大小,让整体码率更加趋近于希望的值,减少波动。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4而-minrate和-maxrate比较简单,设置码率不要低于或者超过某一个阈值
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4压缩视频大小
对于一个非常大的文件,经常需要压缩文件大小可以使用
ffmpeg -i input.mp4 -vcodec h264 -acodec mp3 output.mp4更改视频的分辨率
如果想要改变视频的分辨率
ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4或
ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4裁剪视频
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4说明:
-filter:v过滤视频
设置视频的宽高比
ffmpeg -i input.mp4 -aspect 16:9 output.mp4常见的宽高比:
- 16:9
- 4:3
- 16:10
- 5:4
给音频文件增加图片
将一个音频文件编程一个视频
ffmpeg -loop 1 -i input_image.jpg -i input_audio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4查看 ffmpeg 支持格式
要查看你的 ffmpeg 支持哪些格式,可以用如下命令:
ffmpeg -formats | less设置输出文件编码率 64 kbit/s, To set the video bitrate of the output file to 64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi设置输出文件帧率为 24 fps,To force the frame rate of the output file to 24 fps:
ffmpeg -i input.avi -r 24 output.avi强制输入文件以 1 帧,输出文件 24 帧 , To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:
ffmpeg -r 1 -i input.mp4 -r 24 output.avi下面几步分别是,创建frames文件夹,利用 ffmpeg 将视频文件以每秒 10 帧输出成图像保存到 frames 文件夹中,再利用 ImageMagick 将图片组成 gif。其中convert命令来自 ImageMagick。
mkdir frames
ffmpeg -i input.mp4 -r 10 frames/frame%03d.png
convert -delay 5 -loop 0 frames/frame*.png output.gifSource:http://superuser.com/a/556031
利用 ffmpeg 屏幕录制
参考:https://trac.ffmpeg.org/wiki/Capture/Desktop
添加水印
ffmpeg -i input.mp4 -i picture.png -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2" output.mp4picture.png 为水印图片, overlay 为水印位置
ffmpeg 使用语法
ffmpeg 使用语法:
ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...如果没有输入文件,那么视音频捕捉就会起作用。
作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b 64 选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。
缺省情况下,ffmpeg 试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。
通用选项
- -L license 显示协议
- -h 帮助
- -formats 显示可用的格式,编解码的,协议的
- -decoders 可用解码器
- -encoders 可用编码器
主要选项
- -i filename 输入文件
- -y 覆盖输出文件
- -n 不覆盖输出文件,如果输出文件存在则退出
- -t duration (input/output)
设置纪录时间 hh:mm:ss[.xxx] 格式的记录时间也支持,在-i之前使用,则对输入文件限制记录时间;如果对输出文件使用,则是限制输出文件的时长。 - -ss position
搜索到指定的时间 [-]hh:mm:ss[.xxx] 的格式也支持 ,更多参考 - -title string 设置标题
- -author string 设置作者
- -copyright string 设置版权
- -comment string 设置评论
- -f fmt 强迫采用格式 fmt 输出
- -c[:stream_specifier] codec (input/output, per-stream)
- -codec[:stream_specifier] codec (input/output, per-stream)
给输入文件指定解码器,给输出文件指定编码器, codec 为编码器名字,如果 codec 值为copy则默认为和原视频一致。 - -vcodec codec
vcodec 是 -codec:v 的一个别称,强制使用 codec 编解码方式,未设定时使用与输入流相同的编码器。如果用 copy 表示原始编解码数据必须被拷贝。 - -target type 设置目标文件类型 (vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置,只需要输入如下的就可以了:
ffmpeg -i input.avi -target vcd /tmp/vcd.mpg - -hq 激活高质量设置
- -itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset 秒。 [-]hh:mm:ss[.xxx] 的格式也支持
视频选项 {#video-options}
- -vframes number (output)
设置视频输出帧数,是-frames:v的别称。 - -b bitrate 设置比特率,缺省 200kb/s
- -r fps 设置帧率 缺省 25
-s size 设置画面的宽高
设置帧大小,分辨率, 格式为 wxh 缺省为原视频大小。下面的简写也可以直接使用:
ntsc 720x480
snits 640x480
hd720 1280x720
hd1080 1920x1080
更多参考- -aspect aspect 设置画面比例 4:3 16:9 或 1.3333 1.7777
- -croptop size 设置顶部切除带大小 像素单位
- -cropbottom size –cropleft size –cropright size
- -padtop size 设置顶部补齐的大小 像素单位
- -padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色 (hex,6 个 16 进制的数,红:绿:兰排列,比如 000000 代表黑色)
- -vn 不做视频记录,输出无视频内容
- -bt tolerance 设置视频码率容忍度 kbit/s
- -maxrate bitrate 设置最大视频码率容忍度
- -minrate bitreate 设置最小视频码率容忍度
- -bufsize size 设置码率控制缓冲区大小
- -sameq 使用同样视频质量作为源(VBR)
- -pass n 选择处理遍数(1 或者 2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
- -passlogfile file 选择两遍的纪录文件名为 file
高级视频选项
- -g gop_size 设置图像组大小
- -intra 仅适用帧内编码
- -qscale q 使用固定的视频量化标度 (VBR)
- -qmin q 最小视频量化标度 (VBR)
- -qmax q 最大视频量化标度 (VBR)
- -qdiff q 量化标度间最大偏差 (VBR)
- -qblur blur 视频量化标度柔化 (VBR)
- -qcomp compression 视频量化标度压缩 (VBR)
- -rc_init_cplx complexity 一遍编码的初始复杂度
- -b_qfactor factor 在 p 和 b 帧间的 qp 因子
- -i_qfactor factor 在 p 和 i 帧间的 qp 因子
- -b_qoffset offset 在 p 和 b 帧间的 qp 偏差
- -i_qoffset offset 在 p 和 i 帧间的 qp 偏差
- -rc_eq equation 设置码率控制方程 默认 tex^qComp
- -rc_override override 特定间隔下的速率控制重载
- -me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
- -dct_algo algo 设置 dct 的算法 可用的有 0 FF_DCT_AUTO 缺省的 DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
- -idct_algo algo 设置 idct 算法。可用的有 0 FF_IDCT_AUTO 缺省的 IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
- -er n 设置错误残留为 n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
- -ec bit_mask 设置错误掩蔽为 bit_mask, 该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
- -bf frames 使用 frames B 帧,支持 mpeg1,mpeg2,mpeg4
- -mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用 mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
- -4mv 使用 4 个运动矢量 仅用于 mpeg4
- -part 使用数据划分 仅用于 mpeg4
- -bug param 绕过没有被自动监测到编码器的问题
- -strict strictness 跟标准的严格性
- -aic 使能高级帧内编码 h263+
- -umv 使能无限运动矢量 h263+
- -deinterlace 不采用交织方法
- -interlace 强迫交织法编码仅对 mpeg2 和 mpeg4 有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
- -psnr 计算压缩帧的 psnr
- -vstats 输出视频编码统计到 vstats_hhmmss.log
- -vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
音频选项 {#audio-options}
- -aframes number (output)
设置输出文件音频帧数,是-frames:a的别名 - -ab bitrate
设置音频码率,声音比特率,-ac 设为立体声时要以一半比特率来设置,比如 192kbps 的就设置成 96,高品质音乐建议160kbps(80) 一上 - -ar freq
设置音频采样率,一般设置 44100 - -ac channels
设置通道,声道数, 缺省为 1, 1 为单声道,2 为立体声 - -an 不使用音频纪录
- -acodec codec
使用 codec 编解码,是-codec:a的别名
音频 / 视频捕获选项
- -vd device 设置视频捕获设备。比如 /dev/video0
- -vc channel 设置视频捕获通道 DV1394 专用
- -tvstd standard 设置电视标准 NTSC PAL(SECAM)
- -dv1394 设置 DV1394 捕获
- -av device 设置音频设备 比如 /dev/dsp
高级选项 {#advance-option}
- -map file:stream 设置输入流映射
- -debug 打印特定调试信息
- -benchmark 为基准测试加入时间
- -hex 倾倒每一个输入包
- -bitexact 仅使用位精确算法 用于编解码测试
- -ps size 设置包大小,以 bits 为单位
- -re 以本地帧频读数据,主要用于模拟捕获设备
- -loop 循环输入流。只工作于图像流,用于 ffserver 测试