【问题标题】:"does not contain any stream" if "EXT-X-MEDIA-SEQUENCE" > 0如果“EXT-X-MEDIA-SEQUENCE”> 0,则“不包含任何流”
【发布时间】:2019-07-25 09:36:08
【问题描述】:

我有一个 .ts 文件列表,想将它们保存为多个视频文件。


首先我有一个像这样从流式传输中获得的 .m3u8:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key"
#EXTINF:3.01,
aaa001_00002.ts
#EXTINF:3.01,
aaa001_00003.ts

...

#EXTINF:3.01,
aaa001_01944.ts
#EXT-X-ENDLIST

第 1 步:

所以,我尝试将它转换成几个 m3u8,如下所示:

segment1.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key"
#EXTINF:3.01,
aaa001_00002.ts
#EXTINF:3.01,
aaa001_00003.ts

...

#EXTINF:3.01,
aaa001_00569.ts
#EXT-X-ENDLIST

segment2.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:567
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key"
#EXTINF:3.01,
aaa001_00002.ts
#EXTINF:3.01,
aaa001_00003.ts

...

#EXTINF:3.01,
aaa001_01288.ts
#EXT-X-ENDLIST

等等……

然后逐个执行ffmpeg cmd..

ffmpeg -i /fs/segment2.m3u8 -safe 0 -map 0:v -map 0:a -cpu-used 4 -threads 0 -preset veryfast -c copy -bsf:a aac_adtstoasc output.mp4


但是那些 EXT-X-MEDIA-SEQUENCE > 0(即从segment2.m3u8 ...)将导致

“输出文件 #0 不包含任何流”


然后我尝试让“segment2.m3u8”看起来像这样

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key"
#EXTINF:3.01,
aaa001_00002.ts <--the first video chunk
#EXTINF:3.01,
aaa001_00570.ts <--the start point of segment 2
#EXTINF:3.01,
aaa001_00571.ts

...

#EXTINF:3.01,
aaa001_01288.ts
#EXT-X-ENDLIST

ffmpeg 工作正常,并给了我一个输出视频,所以看起来流通道信息在第一个块中。

不过还是有几个问题

  1. 第一段视频在 segment2.mp4 中,我显然不想要它。

  2. segment2输出视频先播放3.01s,然后冻结图像,直到时间达到aaa001_00570.ts再播放


那么,有什么建议可以让我从第一个块中引用流信息吗?还是在播放列表等中忽略它?


更新解决方案

因为它在 #EXT-X-MEDIA-SEQUENCE:0 和 #EXT-X-KEY: IV = 默认情况下有效

所以我在每个播放列表中添加 IV=hex(#EXT-X-MEDIA-SEQUENCE)

segment1.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key",IV=0x00000000000000000000000000000000
#EXTINF:3.01,
aaa001_00002.ts
#EXTINF:3.01,
aaa001_00003.ts

...

#EXTINF:3.01,
aaa001_00569.ts
#EXT-X-ENDLIST

segment2.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:567
#EXT-X-KEY:METHOD=AES-128,URI="aaa001_00001.key",IV=0x00000000000000000000000000000237
#EXTINF:3.01,
aaa001_00570.ts

...

#EXTINF:3.01,
aaa001_01288.ts
#EXT-X-ENDLIST

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    AES-128 加密/解密需要一个 16 字节的初始化向量 (IV)。如果IV 属性未在EXT-X-KEY 标记中指定,则默认为EXT-X-MEDIA-SEQUENCE

    您的问题很可能是由错误的 IV 引起的。您必须根据播放列表中的条目数找到正确的序列号,片段的文件名无关紧要。

    您可以使用openssl in CLI mode 来测试一个段是否被正确解密。

    【讨论】:

    • 啊.. 所以如果密钥与#EXT-X-MEDIA-SEQUENCE:0 一起使用。我需要做的是在“Step 1”播放列表的“#EXT-X-KEY”行后面添加一个“IV:0x00000000000000000000000000000000”?
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2021-07-26
    • 2019-07-21
    • 2019-07-21
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多