使用 FFmpeg 实现 HLS
HLS implementation with FFmpeg
我正在尝试使用 FFmpeg 实现 HLS 以进行转码 + 分段,但在过去的一周里一直面临着困扰我的几个问题。
问题
网络服务器目前正在接收实时录制的 MP4 片段,需要处理转码和分段。
由于正在接收 mp4 片段,因此需要对其进行编码。然后分段。如果我 运行 一个分段器(无论是 ffmpeg 还是 apple mediastreamsegmenter),每个 mp4 片段本身都被视为 VOD,我无法将它们集成为更大的实时事件实现的一部分。
我想到了一个解决方案,每次我收到一个 mp4 片段时,我首先使用 fmpeg 将它与以前的片段连接起来形成更大的 mp4,然后将其传递给 HLS 进行分段。这也不起作用,因为整个流每次都必须重新分段,并且现有的 TS 片段被相似但及时移动的新片段替换。
实施 1
ffmpeg -re -i fragmentX.mp4 -b:v 118k -b:a 32k -vcodec copy -preset:v veryfast -acodec aac -strict -2 -ac 2 -f mpegts -y fragmentX.ts
我自己管理 m3u8 清单,删除旧片段并添加新片段。
验证流时,我发现它与 EXT-X-DISCONTINUITY 标签堆叠在一起,使流无法观看。
实施 2
首先将最新片段与overall.mp4合并
ffmpeg -i "concat:newfragment.mp4|existing.mp4" -c copy overall.mp4
然后将组合传给ffmpeg进行HLS分割
ffmpeg -re -i overall.mp4 -ac 2 -r 20 -vcodec libx264 -b:v 318k -preset:v veryfast -acodec aac -strict -2 -b:a 32k -hls_time 2 -hls_list_size 3 -hls_allow_cache 0 -hls_base_url /Users/JosephKalash/Desktop/test/350/ -hls_segment_filename '350/fragment%03d.ts' -hls_flags delete_segments 350/index.m3u8
拼接并不完美,在应该拼接片段的地方存在明显的故障。分段替换旧片段,并且每次调用 ffmpeg 时都会重写清单,就好像它是一个新的 HLS 流一样。
我不知道如何让它正常工作。
有什么想法吗?
依靠 nginx rtmp module 解决,结果证明适合上述实现。
我正在尝试使用 FFmpeg 实现 HLS 以进行转码 + 分段,但在过去的一周里一直面临着困扰我的几个问题。
问题
网络服务器目前正在接收实时录制的 MP4 片段,需要处理转码和分段。
由于正在接收 mp4 片段,因此需要对其进行编码。然后分段。如果我 运行 一个分段器(无论是 ffmpeg 还是 apple mediastreamsegmenter),每个 mp4 片段本身都被视为 VOD,我无法将它们集成为更大的实时事件实现的一部分。
我想到了一个解决方案,每次我收到一个 mp4 片段时,我首先使用 fmpeg 将它与以前的片段连接起来形成更大的 mp4,然后将其传递给 HLS 进行分段。这也不起作用,因为整个流每次都必须重新分段,并且现有的 TS 片段被相似但及时移动的新片段替换。
实施 1
ffmpeg -re -i fragmentX.mp4 -b:v 118k -b:a 32k -vcodec copy -preset:v veryfast -acodec aac -strict -2 -ac 2 -f mpegts -y fragmentX.ts
我自己管理 m3u8 清单,删除旧片段并添加新片段。
验证流时,我发现它与 EXT-X-DISCONTINUITY 标签堆叠在一起,使流无法观看。
实施 2
首先将最新片段与overall.mp4合并
ffmpeg -i "concat:newfragment.mp4|existing.mp4" -c copy overall.mp4
然后将组合传给ffmpeg进行HLS分割
ffmpeg -re -i overall.mp4 -ac 2 -r 20 -vcodec libx264 -b:v 318k -preset:v veryfast -acodec aac -strict -2 -b:a 32k -hls_time 2 -hls_list_size 3 -hls_allow_cache 0 -hls_base_url /Users/JosephKalash/Desktop/test/350/ -hls_segment_filename '350/fragment%03d.ts' -hls_flags delete_segments 350/index.m3u8
拼接并不完美,在应该拼接片段的地方存在明显的故障。分段替换旧片段,并且每次调用 ffmpeg 时都会重写清单,就好像它是一个新的 HLS 流一样。
我不知道如何让它正常工作。
有什么想法吗?
依靠 nginx rtmp module 解决,结果证明适合上述实现。