我尝试了以下命令从视频中提取音频:

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

但我得到了如下的输出

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

有人能帮忙吗?


当前回答

如果封装到avi中的音频一开始就不是mp3格式,您可能需要指定-acodec mp3作为附加参数。或者不管你的mp3编解码器是什么(在Linux系统上可能是-acodec libmp3lame)。您还可以通过指定-f mp3来“强制”将格式转换为mp3,从而获得与平台无关的相同效果,尽管不是所有版本的ffmpeg仍然支持这种切换。你的里程可能会有所不同。

其他回答

提取音频流,不需要重新编码。

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac

-vn是no video。 -acodec copy表示使用已经存在的相同音频流。

读取输出,看看它是什么编解码器,以设置正确的文件名扩展名。

如果封装到avi中的音频一开始就不是mp3格式,您可能需要指定-acodec mp3作为附加参数。或者不管你的mp3编解码器是什么(在Linux系统上可能是-acodec libmp3lame)。您还可以通过指定-f mp3来“强制”将格式转换为mp3,从而获得与平台无关的相同效果,尽管不是所有版本的ffmpeg仍然支持这种切换。你的里程可能会有所不同。

为了提取而不进行转换,我使用上下文菜单项-作为Linux中的文件管理器自定义操作-来运行以下(在检查了视频包含的音频类型之后;例如,视频包含ogg音频):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

这是基于ffmpeg命令ffmpeg -i INPUT -map 0:a -c:a copy OUTPUT。

我使用-map 0:1没有问题,但是,正如@ lord necbeard的评论所说,“流0:1不能保证总是音频。使用-map 0:a代替-map 0:1可以避免歧义。”

对于寻找更简单的方法从视频文件中提取音频,同时保留原始视频文件的参数的人,您可以使用:

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

例如,运行:

ffmpeg -i screencap.mov screencap.mp3

从mov视频文件中提取mp3音频文件。

这是我刚才用的:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

选项的解释:

my.mkv is a source video file, you can use other formats as well -map 0:3 means I want 3rd stream from video file. Put your N there - video files often has multiple audio streams; you can omit it or use -map 0:a to take the default audio stream. Run ffprobe my.mkv to see what streams does the video file have. my.mp3 is a target audio filename, and ffmpeg figures out I want an MP3 from its extension. In my case the source audio stream is ac3 DTS and just copying wasn't what I wanted 320k is a desired target bitrate -vn means I don't want video in target file