6

我正在尝试使用 FFMPEG 修剪/切断我视频的最后 3 秒,但这确实令人头疼。

以下代码修剪但仅保留最后 3 秒。我不想保留 3 秒,我不需要,我想保留已删除的部分。

ffmpeg -sseof -3 -i input.mp4 output.mp4

有人可以帮我提供正确的代码吗?我还想请求一个批处理代码,它会自动修剪我文件夹中所有最后 3 秒的视频。谢谢您的帮助。

4

3 回答 3

7

用 ffmpeg 剪辑视频。

利用

ffmpeg -i input.mp4 -ss 3 -i input.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy out.mp4
于 2019-03-26T14:06:18.390 回答
5

我认为 ffmpeg 不允许在持续时间内使用“从头开始”规范。您必须自己检测视频的持续时间并减去 3 秒。

ffprobe -i input.mp4 -show_entries format=duration -v quiet -of csv="p=0"

您可以在脚本中执行此操作。例如在 bash 中:

dur=$(ffprobe -i input.mp4 -show_entries format=duration -v quiet -of csv="p=0")
trim=$((dur - 3))
ffmpeg -t $trim -i input.mp4 output.mp4
于 2019-03-25T11:56:30.890 回答
1

为方便起见,这是一个 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 修剪 3.0 秒(输出~/Videos/input_video_Trim_3.0.mp4:)

. ~/trim_video.sh ~/Videos/input_video.mp4 3.0
于 2021-09-16T01:45:24.677 回答