如何在不解压缩的情况下使用 ffmpeg 从 mp4 文件中批量提取音频(自动音频编解码器检测)?

wry*_*ych 21 bash ffmpeg

我有 228 个 mp4 文件(2.6GB)并且想从中提取音频(mp3 或 ogg)。我想批量提取它们 - 最好使用 bash。我不确定所有文件是否使用相同的音频编解码器,因为它们是在不同年份录制的,从 2006 年到 2012 年不等。

我想遍历所有这些,选择文件名,检测音频编解码器并使用 ffmpeg 提取音频。

是否可以?

roa*_*dmr 32

你说你想“从中提取音频(mp3 或 ogg)”。但是如果 mp4 文件中的音频不是其中之一呢?无论如何你都必须转码。那么为什么不把音频格式检测留给 ffmpeg 呢?

转换一个文件:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg
Run Code Online (Sandbox Code Playgroud)

转换多个文件:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done
Run Code Online (Sandbox Code Playgroud)

您当然可以为您喜欢的音频编码选择任何 ffmpeg 参数,以设置比特率等。

使用-acodec libmp3lame并将扩展名从.ogg更改.mp3为 mp3 编码。

如果您想要真正提取音频,您只需使用-acodec copy. 当然,主要区别在于转码速度慢且占用大量 CPU,而复制非常快,因为您只是将字节从一个文件移动到另一个文件。以下是仅复制音轨的方法(假设它是 mp3 格式):

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,音频文件格式必须与容器所具有的一致(即,如果音频是 AAC 格式,则必须说audiofile.aac)。您可以使用该ffprobe命令查看您拥有哪种编解码器,这可能会提供一些信息:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"
Run Code Online (Sandbox Code Playgroud)

自动解析音频编解码器并相应地命名音频文件的一种可能方法是:

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done
Run Code Online (Sandbox Code Playgroud)

注意:输出文件是在output它开始创建的子目录中创建的(如果需要)。对于 mp3 和 vorbis 以外的其他编解码器,它将音频转换为 ogg。Ubuntu 14.04 在标准存储库中没有 ffmpeg,但您可以添加 ppa:mc3man/trusty-media 存储库并安装 ffmpeg 包以获得所需的软件。有关详细信息,请参见此处