欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

基于HLS的直播点播笔记

流媒体 迷途小书童 5年前 (2020-01-14) 3824次浏览 0个评论

环境

  • 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表示不限制,有多少个 tsm3u8 文件就包含多少个 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%,如下

参考资料

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

喜欢 (0)

您必须 登录 才能发表评论!