【发布时间】:2019-12-04 22:32:45
【问题描述】:
有一个视频,其实是一个HLS流(TS文件的序列) 我想取出一个 TS 块并用另一个替换它。 另一个块将使用相同的 FFMPEG 编码设置进行编码。
如果你想知道我为什么需要这个: 有五个小时的 HLS 流。其中一位 TS 的视频标题错误。我需要在不重新编码整个 HLS 流的情况下更改该 TS。
目前我尝试过:
- 获取 TS 并使用 FFMPEG 将其转换为 mp4
- 编辑 mp4 视频(更改标题)并另存为新的 mp4
- 将新的 mp4 转换为新的 TS(使用 FFMPEG,与用于原始视频的设置相同)
- 用新的 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 文件(旧的和新的)都有视频和音频流。
看起来应该做点别的事情。我认为解决方案类似于广告插入。
【问题讨论】: