ffmpeg - 使用 FFmpeg 实现 HLS

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

我正在尝试使用 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 list ,删除旧片段并添加新片段。

验证流时,我发现它堆满了 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 时都会重写 list ,就好像它是一个新的 HLS 流一样。

我不知道如何让它正常工作。

有什么想法吗?

最佳答案

依靠nginx rtmp module解决事实证明它适合上述实现。

关于ffmpeg - 使用 FFmpeg 实现 HLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928333/

相关文章:

audio - 如何使用 ffmpeg 将音频流重定向到虚拟脉冲音频麦克风?

ios - 如何从充当服务器的 iPhone 流式传输视频?

iphone - 以特定风格在 iPad 上播放视频

ios - 编译 ffmpeg 以支持 SPEEX 解码

ffmpeg - 使用 FFMPEG 转换的视频没有视频时长信息

video - H.264 流媒体要求

ios - 在 iOS 8.x 中,字符在 WebVTT 中被破坏以用于字幕

iOS 恢复 HLS 下载并删除部分下载的文件

android - Android 4 上的 Http Live Streaming( Ice Cream Sandwich )

datetime - FFmpeg strftime 微秒