我试图使用FFmpeg来实现HLS,用于转码+分段,但是在过去的一周里,我一直面临着一些困扰我的问题。
问题
Webserver目前接收正在录制的实时MP4片段,需要处理转码和分段。
当接收到mp4片段时,需要对它们进行编码。然后分割。如果我运行分段器(不管是ffmpeg还是apple纵隔器),那么每个mp4片段都会被单独当作VOD来处理,而且我无法将它们集成为更大的实时事件实现的一部分。
我想到了一个解决方案,每当我收到一个mp4片段时,我首先使用fmpeg将其与前面的片段连接起来,形成更大的mp4,然后将其传递给HLS。这也不起作用,因为每一次都必须重新分割整个流,而现有的TS片段被类似但在时间上移动的新片段所取代。
实现1
-re -i fragmentX.mp4 -b:v 118 k -b:a 32k -vcodec复制-preset:v非常快的-acodec aac -strict -2 -ac 2 -f mpegts -y fragmentX.ts
我自己管理m3u8清单,删除旧片段并追加新片段。
在验证流时,我发现它与EXT-X-DISCONTINUITY标记堆叠在一起,使流无法观察。
实现2
首先将最新片段与overall.mp4合并
-i "concat:newfragment.mp4|existing.mp4“-c复制overall.mp4
然后将该组合传递给ffmpeg进行HLS分割。
ffmpeg -re -i overall.mp4 -ac 2 -r 20 -vcodec libx264 -b:v 318 k -preset:v超高速-acodec aac -strict -2 -b:a 32k -hls_time 2 -hls_list_size 3 -hls_allow_cache 0 -hls_base_url /User/JosephKalash/Desktop/test/350/ -hls_segment_filename‘350/片段%03d.ts’-hls_flags -hls_segment_filename 350/index.m3u8
级联不是完美的,在那些碎片应该被缝合的地方有明显的小故障。分段替换旧的片段,并且每次调用ffmpeg时都重写清单,就好像它是一个新的HLS流一样。
我想不出怎样才能让它正常工作。
有什么想法吗?
发布于 2017-06-06 23:13:16
通过依赖nginx rtmp模块来解决,这证明了适合于上面的实现。
https://stackoverflow.com/questions/31928333
复制相似问题