批量删除多个 MP4 文件的开头和结尾

批量删除多个 MP4 文件的开头和结尾

我有几百个视频,需要删除前 20 秒和后 30 秒。

显然一次只做一件事不太实际。我能以某种方式自动完成这件事吗,比如在 OS X Automator 脚本中?

答案1

假设你运行 *nix 和 Bash,下载 ffmpeg 静态构建适用于您的操作系统。然后,获取ffmpeg文件并将其复制到/usr/bin/ffmpeg

sudo cp ~/Downloads/ffmpeg/ffmpeg /usr/bin/ffmpeg
sudo chmod +x /usr/bin/ffmpeg

现在您可以在 Bash 中运行这个 shell 脚本 — — 将其复制粘贴到视频所在的文件夹中就足够了。

for f in *.mp4; do
    duration=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
    length=$(echo "$duration" | awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }' )
    trim_start=20
    trim_end=$(echo "$length" - 30 - "$trim_start" | bc)
    echo ffmpeg -ss "$trim_start" -i "$f" -c copy -map 0 -t "$trim_end" "${f%.mp4}-trimmed.mp4"
done

笔记:删除echo语句以实际执行命令。最好先测试生成的命令的准确性。这将生成类似以下内容的内容:

ffmpeg -ss 20 -i input.mp4 -c copy -map 0 -t 161.58 input-trimmed.mp4

该脚本将计算输入的总运行时间,减去开始时间和要从结尾删除的时间,然后告诉 ffmpeg 从您指定的开始时间到新计算的结束时间进行流复制。这不会以任何方式损害视频和音频质量。即使对于大文件,它也应该在几秒钟内运行完毕。

澄清一下,-ss设置开始时间并将-c copy -map 0所有视频、音频和字幕流从原始版本复制到剪切版本。-t设置结束时间。请参阅FFmpeg Wiki 上的这篇文章有关寻求的更多信息。

答案2

如果你习惯使用命令行,我建议FFmpeg

ffmpeg -i file.mp4 -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output.mp4

另一个选项是使用一个小型 shell 脚本,它循环遍历您的文件并为每个文件运行一个单文件 FFmpeg 作业。不过,我从未使用过 Mac shell :)

for f in *.mp4; do ffmpeg -i $f -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output/$f; done

希望这能有点帮助。

相关内容