我用相机拍摄了一段视频,但不知道具体时长。我想ffmpeg
保留并剪切视频的最后 7 秒。可以吗?
我尝试了以下命令:
ffmpeg -t 00:00:07 -i input.avi -vcodec copy newfile.avi
但它只跳过视频的前 7 秒,并翻转显示视频。
答案1
使用-sseof
(相对于文件末尾搜索)选项。
假设你想保留最后 7 秒的数据,你可以使用:
ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
查看文档在这里。
注意:此答案于 2014 年发布,当时尚不存在此选项。它直到 2015 年才添加 — 答案自此更新。
答案2
三种不同的情况。我添加了前两种以便澄清。
1 - 只想保留视频的最后 N 秒
不要使用 [-ss #],而要使用 [-sseof -#]
例如:-sseof -7
$ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
保留视频的最后 7 秒并丢弃其余部分
2 - 想要删除视频的最后 N 秒并保留其余部分。(手动输入时长)
此选项需要手动输入结束时间(对于自动,请参阅#3)
使用 -ss 和 -t(从起点开始的持续时间)或 -to(特定时间戳)
您需要手动计算此选项的结束时间。
示例:
$ ffmpeg -ss 00:00:00 -to 01:32:00 -i input.mp4 -c copy output.mp4;
保留从时间戳 00:00:00 到时间戳 01:32:00 的视频
$ ffmpeg -ss 00:00:04 -t 01:00:00 -i input.mp4 -c copy output.mp4;
保留从时间戳 00:00:04 到时间戳 01:00:04
1 小时长的视频。
3 - 想要删除视频的最后 N 秒并保留其余部分。(自动检测文件时长)
您需要同时使用ffmpeg
和ffprobe
,但所有这些都可以在终端中完成,并且只需很少的代码。
根据结束时间截断秒数的唯一方法是获取结束时间。我会批量处理不同长度的视频,因此手动查找和输入每个持续时间是不可能的。我需要自动访问持续时间值并将其传递给 ffmpeg。
神奇公式:
duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4`
duration=`bc $duration - seconds`
例子:
$ duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4`
$ duration=`bc $duration - 7`
$ ffmpeg -ss 00:00:00 -to $duration -i input.mp4 -c copy output.mp4
删除视频的最后 7 秒。
答案3
为了方便起见,这里有一个 bash 脚本:
#!/bin/bash
# Arguments
FILE_RAW=$1
TRIM_EOF_DURATION=${2:-1.0} # Default is 1.0 second trimmed from EOF
# Prepare variables
BASE_PATH=$(dirname $(readlink -f $FILE_RAW))
FILENAME_EXT="$(basename "${FILE_RAW}")"
FILENAME_ONLY="${FILENAME_EXT%.*}"
EXT_ONLY="${FILENAME_EXT#*.}" # Or hardcode it like "mp4"
FILENAME_ONLY_PATH="${BASE_PATH}/${FILENAME_ONLY}"
# Trim EOF duration
INPUT_DURATION=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "${FILENAME_ONLY_PATH}.${EXT_ONLY}")
OUTPUT_DURATION=$(bc <<< "$INPUT_DURATION"-"$TRIM_EOF_DURATION")
ffmpeg -i "${FILENAME_ONLY_PATH}.${EXT_ONLY}" -map 0 -c copy -t "$OUTPUT_DURATION" "${FILENAME_ONLY_PATH}_Trim_${TRIM_EOF_DURATION}.${EXT_ONLY}"
笔记:使脚本可执行:chmod +x trim_video.sh
用法(输出文件:<PATH_TO_INPUT_VIDEO>_Trim_<TRIM_EOF_DURATION>.mp4
)
. <PATH_TO_THIS_SCRIPT>/trim_video.sh <PATH_TO_INPUT_VIDEO> <OPTIONAL_TRIM_EOF_DURATION>
例子:从 EOF 处修剪 7.0 秒(输出~/Videos/input_video_Trim_7.0.mp4
:)
. ~/trim_video.sh ~/Videos/input_video.mp4 7.0