欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

基于HLS的直播点播笔记

流媒体 迷途小书童 4年前 (2020-01-14) 3251次浏览 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)

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

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.