我有 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 包以获得所需的软件。有关详细信息,请参见此处。