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

时间:2019-07-26 14:47:12

标签: encoding ffmpeg streaming

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

如果您想知道为什么我需要这个: 有五个小时的HLS流。 TS之一的视频标题错误。我需要更改TS,而无需重新编码整个HLS流。

当前我尝试过:

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

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

一旦我用原始TS替换了新的TS,播放器就会正常播放。

两个TS文件均以I帧开头,并且都具有音频。 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”标志。还尝试了带有所有三个选项-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文件(旧文件和新文件)都具有视频和音频流。

看起来应该执行其他操作。我认为解决方案将类似于广告插入。

1 个答案:

答案 0 :(得分:0)

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