使用 FFMpeg 有条件地编码或复制音频流

使用 FFMpeg 有条件地编码或复制音频流

我正在尝试批量转换一组视频文件,其中一些具有 aac 音频,一些具有 wav、原始 PCM 或其他类似格式。

我正在寻找一种方法来:

  • 如果音频流已经是 aac 格式,则复制它 ( -c:a copy)
  • 如果音频流还不是 aac,则将其重新编码为 aac ( -c:a aac -b:a 160k)

我目前的方法是手动识别哪些文件没有 aac 音频流并单独转换它们,但将所有文件一起转换会更好。

有没有办法将音频条件语句插入到 FFMpeg 命令中,如下所示?

for f in *.mkv; do
    ffmpeg -i "$f" -c:v libx264 -c:a [some magic here] "${f%.*}_new.mkv"
done

答案1

ffmpeg如果输入不是特定格式,则编码或流式复制中没有条件语句。但是,您可以使用ffprobe来确定音频格式,然后使用ffmpeg编码或流式复制音频。

这是一个简单的脚本,演示了如何执行此操作。复制并保存它,使用 授予其执行权限chmod +x yourscriptname,然后使用 运行它./yourscriptname input.foo

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$1")

if [ "$audioformat" = "aac" ]; then
  ffmpeg -i "$1" -c:v libx264 -c:a copy "${1%.*}_new.mkv"
else
  ffmpeg -i "$1" -c:v libx264 -c:a aac "${1%.*}_new.mkv"
fi

您可以轻松修改它以满足您的需要。

答案2

这是一个令人惊讶的微妙问题。我花了很长时间,经过多次尝试才解决了所有极端情况。我把我的解决方案放在了网上这里

我的具体用例是*.mp4使用 macOS 制作在 iPad Air 2 上播放的文件,但所使用的工具通常都可以在 Linux 上使用,并且该解决方案很容易适应其他设备类型。

以下是我从该项目主页上摘录的关于进行此项改编的一些笔记:

该项目由三个 Bash shell 脚本组成,它们驱动 ffmpegffprobemediainfo, 和atomicparsley将这些程序支持的任何类型的文件转换为适合在 iPad Air 2 类设备上播放的 H.264 *.mp4 文件。

这些脚本确实包含一些苹果系统主义,因此脚本需要进行一些调整才能在 Linux 上使用,或者在 Windows 上使用赛格威管理系统, 或者西弗吉尼亚海岸

  1. rmtrash程序的行为类似于rm只不过文件被移到了用户的“废纸篓”文件夹中。其他系统也存在许多类似的工具,或者您也可以ipad-h264rm调用或其他“移开”类型的命令替换此行。

  2. opencall 是 macOS 的一种机制,用于使用与其关联的 GUI 程序打开文件。我有*.mp4苏伯勒因为接下来的步骤重混或者转码是查看标签、应用封面等。在 Cygwin 下,你可以使用cygstart。我假设有一种方法可以在 Linux 上获得类似的效果。或者,您可以直接硬编码下一步来代替我的open命令。

您可以使用主页下载部分中的链接从存储库下载软件。

相关内容