- 已编辑
- 1楼
0. 为什么会有这个笔记
对,哔哩哔哩、抖音啥的可以搞直播的一大堆,但咱就想 Customize 一下嘛~
另外你可能不想注册被迫被薅羊毛,而且直接自己搞还省略了中转服务器,减少碳排放,不也挺好吗?
总而言之,这是麻烦但有意思的过程。
1. 你需要什么
直播视频,格式强烈推荐 H264;
FFmpeg,只需要程序本体即可;
一台拥有网络连接的电脑;
网络应该怎么样?
一般来说,以太网+千兆是没问题的;Wi-Fi 如果微信通话不抱怨你的信号质量不佳也没有大问题;调制解调器?你是在跟我开玩笑吧?
Nginx 或其它服务器软件
2. 准备直播
我们通过 FFmpeg 来推流,来看看可用的参数吧。
ffmpeg -re -i <mp4文件> -c:v copy -c:a copy -preset:v ultrafast -tune:v zerolatency -f hls -hls_time 2 -hls_list_size 3 -hls_delete_threshold 1 -hls_allow_cache 1 -hls_segment_type fmp4 -hls_fmp4_init_resend 1 -hls_flags 2 <生成的 m3u8 文件>
以上是一个示例:
-re
确保视频能够以正常速度输出,否则后面的参数会让直播瞬间结束。
-i
指定视频源,没什么。如果直接开摄像头或者直播你的桌面,请去网上自行查找-i
后面应该指定什么。
-c:v copy -c:a copy
直接暴力封装直播源。如果格式本来就是 H264,那么毫无问题。否则这里必须二次转换——请准备好给不堪重负的 CPU 降温(((
-preset:v ultrafast -tune:v zerolatency
以最高时速处理视频文件,确保直播流畅进行。
-f hls
要求 FFmpeg 进行直播推流。这种的方式是将视频分割为一个个小文件,让浏览器可以放一段下载一段。
-hls_time 2
一个小文件至少应该有多少秒。为什么是至少?因为程序会在指定时间的下一个关键帧进行裁剪,因此通常会比指定的时间长一点。在某些极端情况下,例如关键帧间隔极长,即使你指定了一个非常短的时间,小文件仍然会非常大(点名批评 Microsoft Event Highlights,关键帧间隔居然长达6秒),虽然有参数可以强制截取指定时间长度的视频,但这会导致很多问题,因此最好在制作视频时使用较短的关键帧间隔。
-hls_list_size 3
生成的播放列表里面一次应该有多少个小文件。直播时,浏览器要将播放列表里面的所有文件都加载后才会开始播放,因此请不要指定过大的数字。
-hls_delete_threshold 1
应保留几个已经不在播放列表内的小文件。文件夹内最大将始终只有"<hls_list_size>+<hls_delete_threshold>"个文件,其余的将被自动删除。
-hls_allow_cache 1
这个参数是允许缓存的指令,不过对我而言加不加好像没区别,可能对 HDD 有好处吧。
-hls_flags 2
这个参数我一直搞不懂= =
到这里,实际上已经可以生成直播分片了,但仍然可以增加更多参数。
区别在哪里?只使用现在的这些参数,将生成 .ts 文件,但是,ts 文件是可以直接播放的——这可能导致直播被盗!通过添加接下来的参数,将生成 fmp4 文件,区别在哪里呢?fmp4 文件是不能单文件播放的,必须有 init 的加持。更安全了,不是吗?
-hls_segment_type fmp4
使用这个参数来要求 ffmpeg 生成 fmp4 格式的直播分片。虽然 fmp4 的兼容性比 ts 差一点,但只要是新一点的浏览器都差不多支持的。
-hls_fmp4_init_resend 1
每次更新播放列表时都包含 init 文件。init 文件用于初始化 fmp4 直播的播放,如果用户刷新网页,则需要重新获取此文件,因此推荐指定此参数。
您可以微调以上参数以便使直播更加顺滑。也可以查看 FFmpeg 的其它参数以便实现更多功能,例如多分辨率直播,高级视频碎片命名规则等等。
其它的爱咋搞咋搞,这个参数必须要小心使用:
hls_playlist_type
不增加此参数还是一样的效果,而此参数又有vod
和event
两个选项。
event
也是直播,但区别在于这个选项不会删除多余的文件,直播结束之后仍然可以进行回放。但如果在直播期间用户刷新了网页,那么他们将只能从头看起(
vod
和直播没有半毛钱关系!它只会把视频分割成碎片,然后没了。这纯粹是给流媒体服务器使用的。
接下来,配置好您的服务器。(稍后将进一步讲解)我们需要 video-js 在前端进行直播。(稍后将进一步讲解)写一个 HTML 即可。您也可以自定义 Video-js 的 UI。
(最重要的是,video-js 的播放框是很难调整大小的,一般用 iframe 把它包起来以便调整大小。)
启动 FFmpeg 推流,在前端测试直播正常后,就可以正式对外开放了!