【问题标题】:HLS implementation with FFmpeg使用 FFmpeg 实现 HLS
【发布时间】:2023-03-21 02:20:02
【问题描述】:

我正在尝试使用 FFmpeg 实现 HLS 进行转码 + 分段,但在过去一周遇到了一些困扰我的问题。

问题

网络服务器当前接收实时录制的 MP4 片段,需要处理转码和分段。

在接收 mp4 片段时,需要对其进行编码。然后分段。如果我运行分段器(无论是 ffmpeg 还是苹果 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 复制整体.mp4

然后将组合传递给ffmpeg进行HLS分割

ffmpeg -re -i general.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 流。

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

有什么想法吗?

【问题讨论】:

  • 为避免故障,您需要将音频和视频编码为单个连续流。如果您的输入 mp4 格式正确并且被编码为单个流,您可以使用-c:a copy -c:v copy 来避免转码。如果输入的 mp4 格式不正确,或者这些片段是单独编码的,则无法(完全)避免故障。
  • @Wimmel 您能否进一步解释一下“单一连续流”是什么意思?我还尝试保留相同的音频和视频编码器,但没有发现故障减少。
  • 我的意思是你只使用一个编码器,你永远不会重新启动它。这也意味着您不能将输出直接写入 .ts 文件,因为该文件会无限增长。也可以考虑看看github.com/arut/nginx-rtmp-module

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


【解决方案1】:

通过依赖nginx rtmp module 解决,结果证明它适用于上述实现。

【讨论】:

  • 我想使用 HLS 流式传输我的桌面屏幕并了解流式传输的工作原理。我关注了这个www.vultr.com。这里的问题是,如何获取本地服务器设置的密钥。 192.168.1.102 Streaming your desktop 的网址可能是什么。我不想使用OBS project
猜你喜欢
  • 2019-03-06
  • 2016-01-18
  • 2013-08-21
  • 1970-01-01
  • 2015-09-03
  • 2017-07-15
  • 2011-12-10
  • 1970-01-01
  • 2023-02-10
相关资源
最近更新 更多