Answers:
您说要“从它们中提取音频(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软件包以获取所需的软件。有关详细信息,请参见此处。
ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'
; 完成修复。
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
ffmpeg
或ffprobe
不适用于Ubuntu 14.04或更高版本。
正如Nicolas Raoul所说,这需要更新。这是roadmr给出的同一行,但改用avconv:
for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done