如何使用 ffmpeg 设置 mp4 文件末尾的偏移量?

如何使用 ffmpeg 设置 mp4 文件末尾的偏移量?

当我有一个时长为 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是开始+结束修剪。

相关内容