如何使用 ffmpeg 从 mp4 文件批量提取音频而无需解压缩(自动音频编解码器检测)?

如何使用 ffmpeg 从 mp4 文件批量提取音频而无需解压缩(自动音频编解码器检测)?

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

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

是否可以?

答案1

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

要转换一个文件:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

要转换多个文件:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

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

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

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

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

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

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

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

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

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

答案2

正如 Nicolas Raoul 所说,这需要更新。以下是 roadmr 给出的同一行,但使用的是 avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done

相关内容