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


1

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

我正在寻找一种方法来:

  • 复制音频流(如果已经是AAC(-c:a copy))
  • 如果尚未将音频流重新编码为aac(-c:a aac -b:a 160k),则将其重新编码为aac

我当前的方法是手动识别哪些文件没有aac音频流并分别进行转换,但是最好将所有文件一起转换。

有没有办法像下面这样将音频的条件语句插入到FFMpeg命令中?

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

Answers:


5

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转换文件通过这些方案的支持为H.264 * .mp4文件适合玩iPad的空气2类设备上的任何类型。

这些脚本确实包含一些macOS形式,因此这些脚本需要进行一些调整才能在Linux上使用,或在Windows下使用CygwinMSYSWSL的情况下使用

  1. rmtrash程序的行为类似于,rm只是将文件移到用户的“废纸folder”文件夹中。对于其他系统,也存在许多类似的工具,或者您可以仅ipad-h264使用rm呼叫或其他“移开”类型的命令来替换此行。

  2. open调用是一种macOS机制,用于使用与之关联的GUI程序打开文件。我这里有*.mp4Subler相关的文件,因为重新混合转码后的下一步是查看标签,应用封面等。在Cygwin下,您可以使用达到相同的效果cygstart。我认为有办法在Linux上获得类似的效果。另外,您也可以代替我的open命令,对下一步进行硬编码。

您可以使用主页的“下载”部分中的链接从资源库下载软件。


您共享的链接上的代码似乎确实提供了一些有用的信息,可以根据我的需求进行自定义。我将不得不对其进行深入研究,以了解需要修改的内容。我不希望我使用的文件有太多边缘情况。
阿南达·马赫托
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.