使用FFmpeg实现HLS

时间:2015-08-10 20:14:38

标签: ffmpeg video-streaming http-live-streaming hls mpeg2-ts

我正在尝试使用FFmpeg实现HLS转码+分段,但过去一周一直面临着一些困扰我的问题。

问题

Webserver目前正在接收正在录制的实时MP4片段,需要负责转码和分段。

当收到mp4片段时,需要对它们进行编码。然后分段。如果我运行一个分段器(无论是ffmpeg还是apple mediastreamsegmenter),每个mp4片段本身都被视为VOD,而且我无法将它们集成为更大的实时事件实现的一部分。

我想到了一个解决方案,每当我收到一个mp4片段时,我首先使用fmpeg将它与之前的片段连接起来形成更大的mp4然后我传递给HLS进行分段。这不起作用,因为整个流必须每次都被重新分段,并且现有的TS片段被相似的新片段替换,但时间会发生变化。

实施1

  

ffmpeg -re -i fragmentX.mp4 -b:v 118k -b: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流一样。

我无法弄清楚如何让它正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

依靠nginx rtmp module解决,结果证明适用于上述实施。