最近我在 MPlayer 上播放了很多 MPEG-TS 视频。这些视频的来源不明,所以我不知道这些 TS 视频是用什么软件制作的。
问题是MPlayer 的 OSD 经常报告错误的时间戳和持续时间;这似乎是 MPEG-TS 特有的因为我从来没有遇到过(或者至少我不记得遇到过)MPEG-4 或 H.264 这样的问题。
例如,我从我的一个 TS 视频中剪切了以下示例(使用 FFmpeg):托管在 Google Drive 上的 sample.ts(无意侵犯版权)。ffprobe sample.ts
印刷品
Input #0, mpegts, from 'sample.ts':
Duration: 00:00:09.99, start: 1.423344, bitrate: 2827 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv), 1920x1080 [SAR 1:1 DAR 16:9], max. 104857 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x101]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 123 kb/s
当我使用 MPlayer 播放此视频(未传递任何选项)时,osd 时间戳大约从 开始00:00:01
,而报告的持续时间为00:03:40
(请注意,该视频只有 10 秒长!)。
我也测试过这个问题ffplay
(使用-vf showinfo
),时间戳问题与 MPlayer 一致:第一帧显示的信息是
[Parsed_showinfo_0 @ 0x7fbd5242c620] n:0 pts:129003 pts_time:1.43337 pos:564 fmt:yuv420p sar:1/1 s:1920x1080 i:P iskey:1 type:I checksum:405DDE4C plane_checksum:[58C83B11 F8FAD95C B874C9D0]
请注意, 是 ,pts_time
而1.43337
不是预期的0
。因此我猜这个问题与 libav* 有关。 反正,至少ffplay
报告了正确的持续时间,而 MPlayer 则报告了错误,这让我觉得这个场景更加令人费解。
我的问题是
这是一个已知问题/缺陷吗?
有没有什么办法可以解决这个问题?
这对我来说真的很烦人,因为我需要不时提取帧时间戳以进行 FFmpeg 查找。任何帮助都非常感谢。
供您参考,我的 MPlayer 是MPlayer UNKNOWN-4.2.1
从 MacPorts 端口安装在 OS X 10.9.3 上的mplayer-devel @36449_4+osd
。
答案1
显然,我问这个问题是因为对 MPEG-TS 缺乏了解。这种行为是意料之中的,因为 MPEG-TS 就是这么设计的。根据 Etienne Buira 在MPlayer 用户邮件列表,
据我所知,该格式无法可靠地知道它在流中的位置(设计为连续的,并且由于时间戳不能永远增长,因此需要循环它们)。
使用 FFmpeg 重新创建时间戳:
ffmpeg -i input.ts -c:a copy -c:v copy -fflags +genpts output.ts