当我编写代码在给定时间剪切两个不同的视频时,我遇到了麻烦,因为相同的代码在通过相同的ffmpeg
命令处理时不会以相同的方式剪辑视频
对于第一个视频,如果我指定-to
10,它会在前一帧处剪切。
对于第二个视频,如果我指定-to
10,它会剪切在那个框架。
通过阅读评论这里,有人说“查找并不总是在 dts 上进行,它实际上取决于容器。如果容器时间戳是 pts,则查找以 pts 为单位;如果容器时间戳是 dts,则查找以 dts 为单位。”
我可以做些什么来提前确定我的削减将如何进行?
理想情况下,我希望能够在ffprobe
命令的输出中找到信息,然后相应地调整我的逻辑
视频 1
ffprobe -hide_banner steamedHams.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'steamedHams.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2018-02-17T02:19:35.000000Z
Duration: 00:02:43.10, start: 0.000000, bitrate: 190 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 116 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 72 kb/s (default)
Metadata:
creation_time : 2018-02-17T02:19:35.000000Z
handler_name : IsoMedia File Produced by Google, 5-11-2011
视频 2
ffprobe -hide_banner trailer.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'trailer.mp4':
Metadata:
major_brand : mp42
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 2018-03-14T22:10:26.000000Z
encoder : HandBrake 1.0.7 2017040900
Duration: 00:00:33.02, start: 0.000000, bitrate: 2778 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2653 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2018-03-14T22:10:26.000000Z
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default)
Metadata:
creation_time : 2018-03-14T22:10:26.000000Z
handler_name : Stereo
答案1
当然,您可以使用 ffprobe 来检查帧和数据包:
ffprobe -select_streams v -show_packets \
-show_entries packet=pts_time,dts_time -of compact=p=0 input.mp4
这将显示每个数据包的 PTS 和 DTS。
以下帖子可能会对你有帮助识别最近的关键帧在给定的时间戳之前。