使用 ffmpeg 对乱序的 H.264 帧进行重新排序

使用 ffmpeg 对乱序的 H.264 帧进行重新排序

我有一个视频文件,其中包含 MPEGTS“容器”内的 H.264 流。我想提取视频流而不重新编码,并将其放在适当的容器中,如 MP4 或 MKV。演示时间戳正确标识了每个帧的播放时间,但它们看起来是乱码的。

起初,我尝试了这个命令: ffmpeg -i input.h264.ts -c copy output.mp4 但生成的视频在播放过程中经常暂停(我认为播放器这样做是为了遵守无序的显示时间戳)。

然后,我尝试使用这对命令来提取原始 H.264 流,然后将其放入没有显示时间戳的 MP4 容器中,但视频(不再暂停)现在在播放过程中来回跳动:

ffmpeg -i input.h264.ts -c copy intermediate.h264
ffmpeg -i intermediate.h264 -c copy output.mp4

ffprobe 对原始视频输入文件有以下说明:

Input #0, mpegts
Stream #0, Video: h264 (High)

我使用 ffprobe 进行更深入的观察

ffprobe -hide_banner -show_frames -show_entries frame=pkt_pts_time,pkt_pos,pkt_size input.h264.ts

这里要显示的帧太多了,但我会尝试给出输出的概念:

[FRAME]
pkt_pts_time=10
pkt_pos=100000
pkt_size=9000
[/FRAME]
[FRAME]
pkt_pts_time=8
pkt_pos=110000
pkt_size=9000
[/FRAME]
[FRAME]
pkt_pts_time=9
pkt_pos=120000
pkt_size=9000
[/FRAME]
[FRAME]
pkt_pts_time=4
pkt_pos=130000
pkt_size=9000
[/FRAME]

如您所见,帧位置随着每一帧而增加,但 PTS 却从 10 跳回到 8,再跳到 9,再跳回到 4,等等。

在分析了每一帧的 PTS(并观察ffmpeg没有 PTS 的输出)之后,我可以看到每一帧都在流中被考虑,它们只是被混杂在一起了。

是否有一个 ffmpeg 命令或选项可以用来将这些帧(基于它们的 PTS)重新排序为可观看的视频?

相关内容