我用相机拍了一段视频,但我不知道到底有多长。我想ffmpeg只保留和剪切视频的最后 7 秒。这可能吗?
我试过命令:
ffmpeg -t 00:00:07 -i input.avi -vcodec copy newfile.avi
Run Code Online (Sandbox Code Playgroud)
但它只跳过视频的前 7 秒,并显示视频翻转。
小智 11
三种不同的场景。为了澄清起见,我添加了前两个。
使用 [-sseof -#] 代替 [-ss #]
示例:-sseof -7
$ ffmpeg -sseof -7 -i input.mp4 -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)
保留视频的最后 7 秒并丢弃其余部分
此选项需要手动输入结束时间(对于自动输入,请参阅 #3)
使用 -ss 和 -t (从起点开始的持续时间)或 -to (特定时间戳)
您需要为此选项手动计算结束时间。
例子:
$ ffmpeg -ss 00:00:00 -to 01:32:00 -i input.mp4 -c copy output.mp4;
Run Code Online (Sandbox Code Playgroud)
将视频从时间戳 00:00:00 保留到时间戳 01:32:00
$ ffmpeg -ss 00:00:04 -t 01:00:00 -i input.mp4 -c copy output.mp4;
Run Code Online (Sandbox Code Playgroud)
保留视频从时间戳 00:00:04 到时间戳 01:00:04
1 小时长的视频。
您需要同时使用ffmpeg和ffprobe,但这一切都可以在终端中完成,只需很少的代码。
根据结束时间截断秒数的唯一方法是获取结束时间。我对不同长度的视频进行批量处理,因此手动查找和输入每个持续时间是不可能的。我需要自动访问持续时间值并将其传递给 ffmpeg。
神奇公式:
duration=`ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4`
duration=`bc $duration - seconds`
Run Code Online (Sandbox Code Playgroud)
例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
删除视频的最后 7 秒。
你必须找出视频的总持续时间(或者与解析ffmpeg输出或使用其它库如的MediaInfo等),d,然后手动从该减去的时间。
假设你的视频长 40 秒,你想剪 7 秒,你只需要编码 33 秒,所以这样做:
ffmpeg -i input.avi -t 33 -c copy output.avi
Run Code Online (Sandbox Code Playgroud)
为了方便起见,这里有一个 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}"
Run Code Online (Sandbox Code Playgroud)
注意:使脚本可执行: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>
Run Code Online (Sandbox Code Playgroud)
示例:从 EOF 开始修剪 7.0 秒(输出:~/Videos/input_video_Trim_7.0.mp4)
. ~/trim_video.sh ~/Videos/input_video.mp4 7.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8927 次 |
| 最近记录: |