我想在任何特定时间戳的开头剪切视频,并且需要precise,所以最近的关键帧不够好。
另外,这些视频相当长——一个小时或更长时间——所以我想避免重新编码如果可能的话,将其全部重新编码,否则仅重新编码总持续时间的最小部分。因此,希望最大限度地利用-vcodec copy
.
我怎样才能使用完成这个ffmpeg
?
注意:请参阅下面的场景和我自己的可能解决方案的粗略想法。
设想:
- Original video
- Desired cut:
- Attempt #1:
- Using
-ss 0:01:35 -i blah.mp4 -vcodec copy
,结果是一个文件,其中:
- 音频从 0:01:30 开始
- 视频也从 0:01:30 开始
- 这太早开始音频和视频
- using
-i blah.mp4 -ss 0:01:35 -vcodec copy
, what results is a file where:
- 音频从 0:01:35 开始,
- but the video is blank/ black for the first 5 seconds,
- 这会准时开始音频,
但视频开始太晚了
粗略的想法
- (1) cut 0:01:30 to 0:01:40
- 重新编码以获得新的关键帧,
包括目标时间 0:01:35 的一个
- 然后将其剪切以获得从 0:01:35 到 0:01:40 的 5 秒
- (2) cut 0:01:40 through till the end
- (3)
ffmpeg concat
第一个短片(第 5 个第二个)
与第二个长剪辑
我知道/可以计算出 (2) 和 (3) 的命令,但不确定 (1) 需要哪些命令。
列出关键帧的时间戳:
ffprobe -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time -of csv=p=0 input.mp4
它会输出类似以下内容:
0.000000
2.502000
3.795000
6.131000
10.344000
12.554000
16.266000
...
假设您要删除时间戳 0 到 5,然后流复制 https://ffmpeg.org/ffmpeg.html#Stream-copy其余的。最近的后续关键帧是 6.131。
将 5 重新编码为 6.131。确保输入和输出匹配属性和格式。对于 MP4,默认设置应该可以完成大部分工作(假设 H.264/AAC),但您可能必须手动匹配配置文件 https://trac.ffmpeg.org/wiki/Encode/H.264#Profile.
ffmpeg -i input.mp4 -ss 5 -to 6.131 trimmed.mp4
Make input.txt
为了连接解复用器 https://ffmpeg.org/ffmpeg-formats.html#concat:
file 'trimmed.mp4'
file 'input.mp4'
inpoint 6.131
连接:
ffmpeg -f concat -i input.mp4 -c copy output.mp4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)