当我有一个时长为 2 小时的 MP4 视频文件并且想要从开始删除 30 秒并从结束删除 1 分钟时,我会ffmpeg
这样使用。
ffmpeg -ss 30 video.mp4 -c copy -t 1:58:30 output.mp4
运行正常。但我必须计算输出视频的长度。有没有选项可以从视频文件末尾截取特定时间?
我想这样写。
ffmpeg -ss 30 video.mp4 -c copy --offset-from-last 1:00 output.mp4
答案1
ffmpeg 中没有这个选项。
您必须使用 解析持续时间ffprobe
,然后使用脚本计算所需的偏移量。要获取总持续时间:
ffprobe -loglevel error input.mp4 \
-show_format -show_entries format=duration -of compact=p=0:nk=1
这将以 显示输出s.msec
。您也可以使用-sexagesimal
选项来打印HH:MM:SS.msec
,但这会使计算偏移量变得有点困难。
执行此操作的简单 bash 脚本:
#!/bin/bash
input=/path/to/your/file.mp4
start="30"
offset="60"
duration="$(ffprobe -loglevel error "$input" -show_format -show_entries format=duration -of compact=p=0:nk=1)"
end=$(echo "$duration - $offset" | bc)
echo ffmpeg -ss "$start" -i "$input" -c copy -to "$end"
请注意,您需要的是-to
而不是-t
。前者会将流切断到指定的点,而使用-t
,您将得到指定的流长度。
答案2
关键帧的问题可能会导致不精确,并且它不适用于字幕流,但这对我来说有效。
ffmpeg -ss 30 -i in.mp4 -itsoffset -90 -i in.mp4 -c copy -map 1:a:0 -map 0 -shortest inter.mp4
进而
ffmpeg -i inter.mp4 -c copy -map 0 -map -0:0 final.mp4
-ss 30
是开始修剪。-itsoffset -90
是开始+结束修剪。