我有 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