是否可以使用 FFMPEG 将 HLS ts 文件 collection 中的一个“.ts”文件替换为另一个“.ts”文件?

Is it possible using FFMPEG to replace one ".ts" file in a HLS ts file collection with another ".ts" file?

有一个视频,实际上是一个HLS流(TS文件序列) 我想取出一个 TS 块并用另一个替换它。 另一个块将使用相同的 FFMPEG 编码设置进行编码。

如果您想知道我为什么需要这个: 有一个五小时的 HLS 流。其中一位 TS 的视频标题有误。我需要在没有 re-encoding 整个 HLS 流的情况下更改那个 TS。

目前我试过:

  1. 获取 TS 并使用 FFMPEG 将其转换为 mp4
  2. 编辑 mp4 视频(更改标题)并另存为新的 mp4
  3. 将新的 mp4 转换为新的 TS(使用 FFMPEG,与用于原始视频的设置相同)
  4. 用新的 TS 替换原来的 TS。

但这不起作用,播放器显示正在加载图标。 (在网络控制台中我看到这个新的 TS 正常加载,状态为 200)

我把新的TS换成原来的TS,播放器就正常播放了。

两个TS文件都以I-frame开头,都有音频。只是P帧和B帧的顺序略有不同

old new
I   I
P   P
B   B
B   B
P   P
B   B
B   B
B   B
P   P
B   B
B   P
B   B
P   B
P   B
B   P

如何让新的 TS 块在原始 TS 序列中工作?

更新:

根据 szatmary 建议(如下),我尝试在所有 ts>mp4>ts 转换过程中包含“-copyts”标志。还尝试使用所有 3 个选项 -1、0 和 1 的“-copytb”标志。但是结果仍然相同 - 播放器不使用新的 TS 块播放 HLS TS 序列 (m3u8)。

在 M3U8 列表中替换 TS 后添加“#EXT-X-DISCONTINUITY”标签,无法解决问题。

没有“#EXT-X-DISCONTINUITY”标签,播放器报错:

VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) There appears to be a playback issue.

code: 4
message: "There appears to be a playback issue."

__proto__:
MEDIA_ERR_ABORTED: 1
MEDIA_ERR_CUSTOM: 0
MEDIA_ERR_DECODE: 3
MEDIA_ERR_ENCRYPTED: 5
MEDIA_ERR_NETWORK: 2
MEDIA_ERR_SRC_NOT_SUPPORTED: 4
code: 0
message: ""
status: null

使用“#EXT-X-DISCONTINUITY”标签,播放器报错:

VIDEOJS: ERROR: (CODE:3 MEDIA_ERR_DECODE) There appears to be a playback issue.

code: 3
message: "error"

__proto__:
MEDIA_ERR_ABORTED: 1
MEDIA_ERR_CUSTOM: 0
MEDIA_ERR_DECODE: 3
MEDIA_ERR_ENCRYPTED: 5
MEDIA_ERR_NETWORK: 2
MEDIA_ERR_SRC_NOT_SUPPORTED: 4
code: 0
message: ""
status: null

两个 TS 文件(旧的和新的)都有视频和音频流。

看来还需要做些其他事情。我认为解决方案类似于广告插入。

您还需要匹配时间戳。转换为 mp4 时,您将丢失时间戳数据。您必须将其保留为 ts 并使用 -copy ts。即使那样,您也可能会丢失连续性计数器并且需要在 m3u8 中放置不连续性标签。你正在尝试做的事情并没有得到真正的支持,而且很难得到仪式。我在工作中做类似的事情,但我们必须编写定制软件来实现无缝过渡。