如果我使用 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 应用程序中播放此类播放列表时,会发生以下情况:
- 总时长显示正确
- 所有片段(除了最后一个片段)只播放 20 秒
- 最后一段正确播放了 30 秒
- 播放器在到达显示的时间线末尾之前停止播放视频(因为除最后一个片段外,每个片段都缩短了 10 秒)
可能的解决方案
我发现如果我在所有片段之间插入#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 清单。
我要达到什么目的:
我有 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 应用程序中播放此类播放列表时,会发生以下情况:
- 总时长显示正确
- 所有片段(除了最后一个片段)只播放 20 秒
- 最后一段正确播放了 30 秒
- 播放器在到达显示的时间线末尾之前停止播放视频(因为除最后一个片段外,每个片段都缩短了 10 秒)
可能的解决方案
我发现如果我在所有片段之间插入#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 清单。