环境
- Intel(R) Core(TM) i5-5200U CPU @2.20GHz
- ubuntu 16.04 64bit
- ffmpeg static 3.2.2
- dstat
前言
本文所涉及到的 ffmpeg
转码参数是适用于 HLS
(H264+AAC
) 的使用场景,其它场景未必适合。
直播环境
我这里的视频源是 udp
,经过大量测试得出的转码命令如下
ffmpeg -i "udp://@225.0.0.10:9001?buffer_size=1000000&fifo_size=1000000" -loglevel quiet -vcodec libx264 -acodec aac -strict -2 -preset ultrafast -tune zerolatency -b 4M -minrate 4M -maxrate 4M -bufsize 8M -ab 128k -r 25 -s 1280x720 -crf 28 -deinterlace -f flv rtmp://10.0.0.188:2935/live/live/index
在直播环境中,-preset
建议设成 ultrafast
,这样就能最快速度进行转码,满足终端播放。除了 ultrafast
之外,还有如下可选项
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium – 默认项
- slow
- slower
- veryslow
-b
、-minrate
、-maxrate
、-ab
用来控制输出码率,-bufsize
通常设置成 -b
的2倍;-r
设置帧率;-s
控制输出分辨率;-deinterlace
去视频锯齿,如果视频源没有问题的话就省略;-tune
设置成 zerolatency
,它还有一些其它的可选项,如下
- film – use for high quality movie content; lowers deblocking
- animation – good for cartoons; uses higher deblocking and more reference frames
- grain – preserves the grain structure in old, grainy film material
- stillimage – good for slideshow-like content
- fastdecode – allows faster decoding by disabling certain filters
- zerolatency – good for fast encoding and low-latency streaming
- psnr – ignore this as it is only used for codec development
- ssim – ignore this as it is only used for codec development
-crf
取值范围是 0~51,0为无损,18人的肉眼无损,默认值是23,51效果最差,一般原则是在画面可接受的前提下尽量增大 crf
值。流媒体一般取23~28;如果片源是一些4:3的标清节目,可以通过 -vf scale=1280x720,setdar=16:9
进行设置;如果需要生成多码率的直播数据,可以这样转码切片
ffmpeg -re -i rtmp://server/live/stream -acodec copy -vcodec libx264 -s 640x360 -b 500k -preset medium -profile:v baseline rtmp://server/live/baseline_500k -acodec copy -vcodec libx264 -s 480x272 -b 300k -preset medium -profile:v baseline rtmp://server/live/baseline_300k -acodec copy -vcodec libx264 -s 320x200 -b 150k -preset medium -profile:v baseline rtmp://server/live/baseline_150k -acodec aac -strict -2 -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
点播环境
点播一般都是现成的影片,按照一定的要求进行转码切片
ffmpeg -re -i test.ts -vcodec libx264 -acodec aac -strict -2 -tune zerolatency -preset ultrafast -r 25 -g 50 -profile:v baseline -level 3.0 -crf 28 -vf scale=1280x720 -b:v 4M -minrate 4M -maxrate 4M -bufsize 8M -b:a 128k -f hls -hls_list_size 0 index.m3u8
这里有一些参数跟直播是一样的,就不再多说。-re
表明按照本地帧率来读取文件,转码总时间一般就是片长,如果 -vcodec
和 -acodec
都是 copy
的话可以删除,-re
来加快切片过程,分分钟搞定,真的是分把钟;-hls_list_size
指定索引文件 index.m3u8
中包含 ts
文件的个数,如果是默认的话,只保留5个 ts
,类似于直播的方式,设置成0表示不限制,有多少个 ts
,m3u8
文件就包含多少个 ts
;-profile:v
可是设置视频的兼容度,可取如下值
- Baseline 3.0 All devices -profile:v baseline -level 3.0
- Baseline 3.1 iPhone 3G and later, iPod touch 2nd generation and later -profile:v baseline -level 3.1
- Main 3.1 iPad (all versions), Apple TV 2 and later, iPhone 4 and later -profile:v main -level 3.1
- Main 4.0 Apple TV 3 and later, iPad 2 and later, iPhone 4s and later -profile:v main -level 4.0
- High 4.0 Apple TV 3 and later, iPad 2 and later, iPhone 4s and later -profile:v high -level 4.0
- High 4.1 iPad 2 and later, iPhone 4s and later, iPhone 5c and later -profile:v high -level 4.1
- High 4.2 iPad Air and later, iPhone 5s and later -profile:v high -level 4.2
如何在有限的硬件条件下同时进行多路转码是一个很现实的问题,我在 i5
的机器下进行了一些测试,同时利用 dstat
工具查看系统资源使用情况
上图是使用 -vf w3fdif
去视频锯齿的系统资源使用情况,同样是去锯齿使用 -deinterlace
效果就会好一些,如下图
而如果不需要对视频源做锯齿的处理,CPU
使用率下降了大约 10%,如下
参考资料
https://trac.ffmpeg.org/wiki/Encode/H.264
https://trac.ffmpeg.org/wiki/StreamingGuide
http://slhck.info/video/2017/03/01/rate-control.html
https://trac.ffmpeg.org/wiki/EncodingForStreamingSites
https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video