如果我使用 ffmpeg 一个一个地单独构建 TS 段,是否需要 #EXT-X-DISCONTINUITY 标记?

Is #EXT-X-DISCONTINUITY tag needed if I build TS segments separately one by one using ffmpeg?

我要达到什么目的:

我有 1000 张 PNG 图片。我想要一个 30 秒的视频,每个单独的图像创建 0.1 fps。然后我想从所有这些视频中一个接一个地创建多个 m3u8 播放列表,每个播放列表都有随机顺序的视频。

我尝试了什么:

我使用以下命令为我的每个图像创建了一个 TS 视频文件:

ffmpeg -y -loop 1 -t 30 -r 0.1 -i INPUT_IMAGE_X.png -c:v libx264 -crf 26 -pix_fmt yuv420p OUTPUT_VIDEO_X.ts

然后我使用以下格式创建了一个播放列表:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:30
#EXTINF:30.00000,
OUTPUT_VIDEO_1.ts
#EXTINF:30.00000,
OUTPUT_VIDEO_2.ts
#EXTINF:30.00000,
OUTPUT_VIDEO_3.ts
...
#EXTINF:30.00000,
OUTPUT_VIDEO_1000.ts
#EXT-X-ENDLIST

问题:

当我使用 AVPlayer 在 iOS 应用程序中播放此类播放列表时,会发生以下情况:

可能的解决方案

我发现如果我在所有片段之间插入#EXT-X-DISCONTINUITY 标签,所有片段都会正确播放 30 秒。但是我也注意到,在这种情况下,AVPlayer 在开始播放视频之前需要更多的加载时间。

问题

是否有可能以不需要不连续性标签的方式创建我的视频?它们使我的播放列表文件更大,并增加了视频开始的延迟。

您需要的是每个段中的正确时间戳。我相信 -itsoffset 应该做到这一点——第一段 -itsoffset 0(或什么都不做),第二段 -itsoffset 30,第三段 -itsoffset 60,等等

您可能还可以使用 concat demuxer 读取输入和 -f hls -hls_time 30 -hls_playlist_type vod 来让 ffmpeg 为您完成所有工作; concat demuxer 将处理“循环”每个图像并正确设置时间戳,hls muxer 将写入 TS 段和 HLS 清单。