是否有可能使用 ffmpeg 批量转换视频文件(不同格式)并删除元数据?

是否有可能使用 ffmpeg 批量转换视频文件(不同格式)并删除元数据?

我有很多家人的视频文件。我使用的是 Windows,视频格式不同:

视频文件:

在此处输入图片描述

DVD 目录包含:

在此处输入图片描述

DVD 目录中的文件是用 DVD 刻录机录制的,然后从 DVD 复制到我的计算机硬盘上。

假设上述目录D:\ffmpeg是我的工作目录ffmpeg。这意味着所有视频文件都存储在那里。

我希望将每个文件转换为mp4mkv(用于测试目的)。例如,输入文件test.avi应提供两个输出文件test.mp4test.mkv。输出文件应具有与输入文件相同的属性。重要的对我来说,屏幕尺寸、宽高比和帧速率是最重要的。视频和音频质量应该保持几乎相同,这样差异就难以察觉。音频编解码器应该只满足音频质量,例如可以是、aac或。我不知道是否可以从源文件中获取音频/视频质量(每秒 kb)设置用于输出文件。如果可能的话,视频编解码器应该是。应该删除 DVD(如果存在)文件的菜单,并将 DVD 源文件合并为一个输出文件。mp3flacvorbisffmpegh.265

到目前为止,我从未使用过ffmpeg。我只阅读了有关当前常见的音频/视频编解码器和视频文件格式的信息。为什么我希望走这条路?许多 GUI 视频编辑程序功能过载且价格昂贵。免费的 GUI 程序可能无法做到这一点。重要的事情是这样的,ffmpeg我可以完全控制要做的事情。

顺便说一下,输出文件中所有可删除的元数据都应被删除。

所以,现在我ffmpeg这里,将其复制到上述目录并需要输入如下内容:

ffmpeg [--option1 ... --optionN] [source files list in the current directory] [output files list]

是否只运行一次就能解决我的任务?如果不能,我自然欢迎针对每种文件格式或其他不同格式的解决方案,如果它更有意义的话。ffmpeg如果这有助于解决此任务,您当然可以自由地建议其他有用的选项设置。

我希望我对任务的描述足够清楚。如果没有,请告诉我。

请不要回答“阅读手册ffmpeg”或“使用程序xyz”。

提前感谢您的帮助和努力!

答案1

是的,使用 可以实现这一点ffmpeg。但是,作为命令行工具,任何处理都应编写脚本。虽然可以同时对多个文件运行它,但ffmpeg单独对每个文件运行它更简单、更简洁。摘自 Linux 手册页:

       ffmpeg reads from an arbitrary number of input "files" (which can be
       regular files, pipes, network streams, grabbing devices, etc.),
       specified by the "-i" option, and writes to an arbitrary number of
       output "files", which are specified by a plain output url. Anything
       found on the command line which cannot be interpreted as an option is
       considered to be an output url.
[...]

       As a general rule, options are applied to the next specified file.
       Therefore, order is important, and you can have the same option on the
       command line multiple times. Each occurrence is then applied to the
       next input or output file.  Exceptions from this rule are the global
       options (e.g. verbosity level), which should be specified first.

       Do not mix input and output files -- first specify all input files,
       then all output files. Also do not mix options which belong to
       different files. All options apply ONLY to the next input or output
       file and are reset between files.

此外,当给定多个输入文件时,默认情况下 ffmpeg 会自动尝试“最佳地”在它们之间映射流 - 如果您想要线性映射输入:输出,则必须自己指定。

因此,除非您想构建如下命令行:

ffmpeg -i file1.avi -i file2.avi -i file3.avi \
       -map 0:a -map 0:v -c:v h265 -c:a aac file1.mp4 \
       -map 1:a -map 1:v -c:v h265 -c:a aac file2.mp4 \
       -map 2:a -map 2:v -c:v h265 -c:a aac file3.mp4

最好只运行三个单独的ffmpeg命令:

ffmpeg -i file1.avi -c:v h265 -c:a aac file1.mp4
ffmpeg -i file2.avi -c:v h265 -c:a aac file2.mp4
ffmpeg -i file3.avi -c:v h265 -c:a aac file3.mp4

这很简单,实际上更短,并且编写脚本更加容易。

多格式

同时创建mp4mkv文件是多余的,因为它们只是容器格式 — 如果您使用相同的编解码器对两个文件进行编码,它们将包含完全相同的音频和视频数据。因此,如果这就是您所说的“测试目的”,那么质量、内容或其他方面都不会有可察觉的差异。

如果你正在测试这两个容器以评估与不同播放设备的兼容性,那就另当别论了,但我建议只创建一两对两种格式的转换,而不是浪费时间做全部其中。

如果您想同时创建它们以节省编码时间,则必须考虑滤镜图和拆分的复杂性。最好先编码为一种输出格式,然后使用以下方法重新混合为另一种输出格式:

ffmpeg -i file1.mp4 -codec copy file1.mkv

这至少会非常快,并且强调了文件包含的事实确切地相同的音频和视频流数据,使得整个练习有点毫无意义。

DVD

对于您的 DVD 内容,它ffmpeg当然可以读取VOB文件,但它无法分析其中的目录,只挑选出主要内容,并选择将哪些部分一起编码成输出文件。您必须自己进行探索。

如上所述,HandBrake 确实是一款非常出色的工具,可以处理所有这些垃圾。它ffmpeg无论如何都会进行处理,所以你仍然在使用它。(你很难找到一个免费/开源的视频/音频处理工具没有使用 ffmpeg,或者至少是它的库。哎呀,大多数商业工具也使用它。

或者,mkvmerge-gui(部分MKVToolNix(也是一个免费工具)可以将文件列表VOB作为序列化输入段,然后非常轻松地将它们重新编码为单个.mkv文件。(实际上,我更喜欢 MKVToolNix 而不是 HandBrake,因为它可以直接进行转码,但我仍然必须手动决定要.VOB处理哪些部分。)

答案2

使用批处理脚本调用 ffmpeg。将脚本放在包含文件的文件夹中。确保 ffmpeg 位于您的路径中。

set /a fname=0
for %%f in (*.avi) do (
  ffmpeg -i "%%~f" -c:v libx265 "!fname!.mp4"
  set /a fname=!fname!+1
)

fname是一个计数器,它将用唯一的名称来命名您的文件。

实际转换是使用默认值完成的 - ffmpeg -i "%%~f" -c:v libx265 "!fname!.mp4"

或者,使用任何基于 ffmpeg 的 GUI。其中包括:-

快门编码器 -https://www.shutterencoder.com/en/或 YAG -https://sourceforge.net/projects/ffmpegyag/

相关内容