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

Ana*_*hto 3 audio linux ffmpeg

我正在尝试批量转换一组视频文件,其中一些具有 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
Run Code Online (Sandbox Code Playgroud)

llo*_*gan 6

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
Run Code Online (Sandbox Code Playgroud)

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