ffmpeg转码小结

/

软硬件环境

  • Intel(R) Core(TM) i5-5200U CPU @2.20GHz
  • ubuntu 16.04 64bit
  • ffmpeg static 3.2.2
  • dstat

前言

本文所涉及到的ffmpeg转码参数是适用于HLS(H264+AAC)的使用场景,其它场景未必适合。

直播环境

我这里的视频源是udp,经过大量测试得出的转码命令如下

  1. 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去视频锯齿,如果视频源OK的话就省略;-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进行设置;如果需要生成多码率的直播数据,可以这样转码切片

  1. 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

点播环境

点播一般都是现成的影片,按照一定的要求进行转码切片

  1. 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工具查看系统资源使用情况

ffmpeg_w3fdif

上图是使用-vf w3fdif去视频锯齿的系统资源使用情况,同样是去锯齿使用-deinterlace效果就会好一些,如下图

ffmpeg_deinterlace

而如果不需要对视频源做锯齿的处理,CPU使用率下降了大约10%,如下

troutling小项目

https://github.com/xugaoxiang/troutling是一个用Python3+PyQt5编写的一个用于直播(测试服务器nginx-rtmp或者srs)转码的图形化工具。

参考资料

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

转载请注明作者和出处,并添加本页链接。
原文链接:http://xugaoxiang.com/post/110

给我留言