【发布时间】:2021-11-12 22:06:48
【问题描述】:
我有几个.ts 文件和对应的index.m3u8 文件,看起来像这样:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:15
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:3.170,
seg-1-v1-a1.ts
#EXTINF:3.170,
seg-2-v1-a1.ts
#EXTINF:3.170,
seg-3-v1-a1.ts
#EXTINF:3.170,
seg-4-v1-a1.ts
#EXTINF:3.170,
seg-5-v1-a1.ts
#EXT-X-ENDLIST
因此,要将其转换为单个 output.mp4 文件,我运行了以下命令:
$ ffmpeg -i index.m3u8 -c copy output.mp4
...
[hls @ 0x55d78a3a6280] Opening 'seg-1-v1-a1.ts' for reading
...
[hls @ 0x55d78a3a6280] Opening 'seg-2-v1-a1.ts' for reading
[hls @ 0x55d78a3a6280] Opening 'seg-3-v1-a1.ts' for reading
[hls @ 0x55d78a3a6280] Opening 'seg-4-v1-a1.ts' for reading
[hls @ 0x55d78a3a6280] Opening 'seg-5-v1-a1.ts' for reading
...
之后,我删除了.ts 文件和index.m3u8,只保留了output.mp4。然而,事实证明,我没有所有 .ts 文件,输出最初更像这样:
$ rm seg-3-v1-a1.ts
$ ffmpeg -i index.m3u8 -c copy output.mp4
...
[hls @ 0x5555d0d86280] Opening 'seg-1-v1-a1.ts' for reading
...
[hls @ 0x5555d0d86280] Opening 'seg-2-v1-a1.ts' for reading
[hls @ 0x5555d0d86280] Opening 'seg-3-v1-a1.ts' for reading
[hls @ 0x5555d0d86280] Failed to open segment 3 of playlist 0
[hls @ 0x5555d0d86280] Opening 'seg-4-v1-a1.ts' for reading
[hls @ 0x5555d0d86280] Opening 'seg-5-v1-a1.ts' for reading
...
观看视频时,在缺失片段的位置,图片冻结几秒钟,然后视频继续播放。我有几个.mp4 文件,我想找出其中哪些受此问题的影响。在没有原始日志的情况下,我如何在运行ffmpeg -i index.m3u8 -c copy output.mp4 命令时找出是否缺少任何段?
我在https://superuser.com/questions/100288/how-can-i-check-the-integrity-of-a-video-file-avi-mpeg-mp4 找到了一个命令,但不幸的是没有发现任何问题:
$ ffmpeg -v error -i output.mp4 -f null -
$ echo $?
0
【问题讨论】:
-
我会
ffprobe -show_packets并为每个流提取每个数据包的dts、pts和duration字段。如果有任何间隙,则意味着缺少一个片段。不过,不确定这是否可行。 -
请提供一个示例 MP4 文件。
-
@user3840170 嘿,谢谢你的想法,我刚刚研究了一下,但我无法理解这些值。在任何情况下,无论是正确的还是有缺陷的输出,似乎都存在差距——我是否删除一个片段并不重要。
-
@finefoot 间隔是指 [pts, pts+duration) 间隔加在一起不形成连接线?
-
@user3840170 没错。这是我为此编写的一个简短的 Python 脚本:anonpaste.org/… dts 中有 2 个空白,pts 中有很多错位
标签: video ffmpeg http-live-streaming m3u8 transport-stream