如果“ EXT-X-MEDIA-SEQUENCE”> 0,则“不包含任何流”

时间:2019-03-04 05:16:33

标签: ffmpeg

我有一个.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_00569.ts
#EXT-X-ENDLIST


步骤1:

因此,我尝试将其转换为如下所示的m3u8:

segment1.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

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 cmd。

  

ffmpeg -i /fs/segment2.m3u8-安全0-地图0:v-地图0:a -cpu使用4-线程0-预设非常快-c复制-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",IV=0x00000000000000000000000000000000
#EXTINF:3.01,
aaa001_00002.ts
#EXTINF:3.01,
aaa001_00003.ts

...

#EXTINF:3.01,
aaa001_00569.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: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

segment2.m3u8

onAuthStateChanged

1 个答案:

答案 0 :(得分:2)

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

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

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