1 FFmpeg从入门到精通-FFmpeg简介
2 FFmpeg从入门到精通-FFmpeg工具使用基础
3 FFmpeg从入门到精通-FFmpeg转封装
4 FFmpeg从入门到精通-FFmpeg转码
5 FFmpeg从入门到精通-FFmpeg流媒体
6 FFmpeg从入门到精通-FFmpeg滤镜使用
7 FFmpeg从入门到精通-FFmpeg中Linux设备操作
8 FFmpeg从入门到精通-FFmpeg接口libavformat的使用
9 FFmpeg从入门到精通-FFmpeg接口libavcodec的使用
10 FFmpeg从入门到精通-FFmpeg接口libavfilter的使用
文章目录
4.FFmpeg转码
4.1 FFmpeg软编码H.264与H.265
支持H.264的封装格式有很多,如FLV、MP4、HLS(M3U8)、MKV、TS等格式;FFmpeg本身并不支持H.264的编码器,而是由FFmpeg的第三方模块对其进行支持,例如x264和OpenH264,二者各有各的优势。由于OpenH264开源比较晚,所以x264还是当前最常用的编码器,这里将重点介绍FFmpeg中x264的使用;使用x264进行H.264编码时,所支持的像素格式主要包含yuv420p、yuvj420p、yuv422p、yuvj422p、yuv444p、yuvj444p、nv12、nv16、nv21。通过ffmpeg -h encoder=libx264可以查看到:
Encoder libx264 [libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10]:
General capabilities: dr1 delay threads
Threading capabilities: other
Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le gray gray10le
因为其所支持的像素色彩格式比较多,所以x264支持的范围更广。下面就来详细介绍FFmpeg中x264的参数。
4.1.1 x264编码参数简介
x264参数在FFmpeg中可以使用很多参数,同样也可以使用x264本身的参数来控制,具体参数列表见下表。

以上为H.264编码时用到的常见的参数,设置参数后编码生成的文件可以通过一些外部协助工具进行查看,如Elecard、Bitrate Viewer、ffprobe等。
4.1.2 H.264编码举例
上节中已经给出了FFmpeg中H.264编码器的操作参数,下面就来列举一些实际中常用的例子。
1.编码器预设参数设置preset
从FFmpeg的x264参考说明中可以看到,可以使用x264 --full help查看preset设置的详细说明,找到x264帮助信息中的preset参数项之后,可以看到其包含了以下几种预设参数,预设参数的详细设置具体如下。
·ultrafast:最快的编码方式
除了默认设置之外,还增加了如下参数设置:
-no-8x8dct --aq-mode 0 --b-adapt 0 --bframes 0 --no-cabac --no-deblock --no-mbtree --me dia --no-mixed-refs --partitions none --rc-lookahead 0 --ref 1 --scenecut 0 --subme 0 --trellis 0 --no-weightb --weightp 0
·superfast:超级快速的编码方式
除了默认设置之外,还增加了如下参数设置:
-no-mbtree --me dia --no-mixed-refs --partitions i8x8,i4x4 --rc-lookahead 0 --ref 1 --subme 1 --trellis 0 --weightp 1
·veryfast:非常快速的编码方式
除了默认设置之外,还增加了如下参数设置:
-no-mixed-refs --rc-lookahead 10 --ref 1 --subme 2 --trellis 0 --weightp 1
·faster:稍微快速的编码方式
除了默认设置之外,还增加了如下参数设置:
-no-mixed-refs --rc-lookahead 20 --ref 2 --subme 4 --weightp 1
·fast:快速的编码方式
除了默认设置之外,还增加了如下参数设置:
-rc-lookahead 30 --ref 2 --subme 6 --weightp 1
·medium:折中的编码方式
参数全部为默认设置。
·slow:慢的编码方式
除了默认设置之外,还增加了如下参数设置:
-b-adapt 2 --direct auto --me umh --rc-lookahead 50 --ref 5 --subme 8
·slower:更慢的编码方式
除了默认设置之外,还增加了如下参数设置:
-b-adapt 2 --direct auto --me umh --partitions all --rc-lookahead 60 --ref 8 --subme 9 --trellis 2
·veryslow:非常慢的编码方式
除了默认设置之外,还增加了如下参数设置:
-b-adapt 2 --bframes 8 --direct auto --me umh --merange 24 --partitions all --ref 16 --subme 10 --trellis 2 --rc-lookahead 60
·placebo:最慢的编码方式
除了默认设置之外,还增加了如下参数设置:
-bframes 16 --b-adapt 2 --direct auto --slow-firstpass --no-fast-pskip --me tesa --merange 24 --partitions all --rc-lookahead 60 --ref 16 --subme 11 --trellis 2
随着所设置参数的不同,所编码出来的清晰度也会有所不同,设置相关的预设参数之后,有很多参数也会被设置所影响,因此需要了解相关的参数含义。为了方便操作,通过preset进行设置即可,下面就来看一下相同的机器中,设置ultrafast与设置medium预设参数之后转码效率的对比:
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
命令行执行之后,输出内容如下:
Output #0, mp4, to 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.27.100
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p(progressive), 1280x720, q=2-31, 2000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc59.37.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc59.37.100 aac
frame= 2114 fps=267 q=-1.0 Lsize= 13331kB time=00:01:10.43 bitrate=1550.5kbits/s dup=1 drop=0 speed= 8.9x
从命令行执行后的输出内容中可以看到,转码的预设参数为ultrafast模式,转码的速度为8.9倍速,接下来再看一下设置为medium模式后的速度:
Output #0, mp4, to 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.27.100
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p(progressive), 1280x720, q=2-31, 2000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc59.37.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc59.37.100 aac
frame= 2114 fps= 56 q=-1.0 Lsize= 12217kB time=00:01:10.37 bitrate=1422.1kbits/s dup=1 drop=0 speed=1.87x
从以上输出内容中可以看到,设置medium模式后,转码速度为1.87倍速,速度虽然降低了,但画质却有了明显的提升,对比效果如图所示。

很显然,图中的上图是通过预设参数ultrafast转码之后的效果,下边的图像是通过medium转码之后的效果上下图像相差比较大,上边图像的马赛克多一些,图中草的对比比较明显,主

本文详细介绍了FFmpeg在H.264和H.265编码、转码中的应用,包括软编码参数设置,如x264和x265的preset、tune、profile、level等参数。同时,讨论了FFmpeg支持的硬编码选项,如NvidiaGPU的NVENC和Intel的QSV技术,以及树莓派的h264_omx编码。此外,还提到了FFmpeg对MP3和AAC音频编码的处理,包括码率控制和质量设置。

168

被折叠的 条评论
为什么被折叠?



