我正在尝试批量转换一组视频文件,其中一些具有 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 脚本组成,它们驱动 ffmpeg
,ffprobe
,mediainfo
, 和atomicparsley
将这些程序支持的任何类型的文件转换为适合在 iPad Air 2 类设备上播放的 H.264 *.mp4 文件。
这些脚本确实包含一些苹果系统主义,因此脚本需要进行一些调整才能在 Linux 上使用,或者在 Windows 上使用赛格威,管理系统, 或者西弗吉尼亚海岸:
这
rmtrash
程序的行为类似于rm
只不过文件被移到了用户的“废纸篓”文件夹中。其他系统也存在许多类似的工具,或者您也可以ipad-h264
用rm
调用或其他“移开”类型的命令替换此行。这
open
call 是 macOS 的一种机制,用于使用与其关联的 GUI 程序打开文件。我有*.mp4
与苏伯勒因为接下来的步骤重混或者转码是查看标签、应用封面等。在 Cygwin 下,你可以使用cygstart
。我假设有一种方法可以在 Linux 上获得类似的效果。或者,您可以直接硬编码下一步来代替我的open
命令。
您可以使用主页下载部分中的链接从存储库下载软件。