如何使用ffmpeg从视频中提取音频?


227

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

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

有人可以帮忙吗?

Answers:


405

要提取音频流而无需重新编码:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn 没有视频。
  • -acodec copy 说使用那里已经存在的相同音频流。

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


53
而不是第一次运行ffmpeg只是为了检查它是哪个音频流,请使用ffprobe input-video.avi
FlorianB

15
如果仅从视频流中提取音频,则音频的长度可能短于视频的长度。为确保不会发生这种情况,请通过对ffmpeg的相同调用来提取音频和视频,例如“ ffmpeg -i vid.avi -map 0:a audio.wav -map 0:v onlyvideo.avi
BlenderBender

2
使用还将原始AAC封装到M4A容器中的命令来扩展此答案将是非常不错的。
Gras Double

8
在这种情况下,只需在目标路径中将“ .aac”替换为“ .m4a”即可。ffmpeg非常聪明,可以猜测您的意图,并将结果封装到M4A容器中:)
Gras Double

1
FWIW,我已经制作一个PHP脚本,让我只指定输入的视频文件,并自动确定输出音频文件的扩展名:superuser.com/questions/1301901/...
节双

117

要从AVI编码高质量的MP3,最好使用-q:a设置可变比特率:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

如果要从视频中提取一部分音频,请使用-ss选项指定开始时间戳,使用-t选项指定编码持续时间,例如3分5秒,持续45秒:

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • 时间戳记必须采用HH:MM:SS.xxx格式或以秒为单位。

  • 如果不指定-t选项,它将结束。

工作示例:

  1. 下载ffmpeg
  2. 打开命令提示符(开始>运行> CMD)或在Linux / Mac上打开终端
  3. cd到带有ffmeg.exe的目录
  4. 发出命令并等待输出文件(或解决任何错误)

在此处输入图片说明


3
以下是有关这些-q:a值的指南:trac.ffmpeg.org/wiki/Encode/MP3零是最高质量的VBR设置,通常会导致正常CBR范围的上部(其中320 kbit / s是最大值,可能会超出无损压缩变得更合适的程度)。
Evgeni Sergeev

3
怎么-map a办?
尤利安奥诺弗雷

警告:这是对音频进行有损压缩的重新编码,这会稍微降低质量。如果原件已被压缩,则会使质量下降两次,这可能会引起注意,也可能不会引起注意。
Davidmh '18 -10-8

当上面的with命令-vn不起作用时,此命令对我有用。
嗯,

12

命令行正确,并且可以在有效的视频文件上运行。我将确保您已安装正确的库以用于mp3,并使用其他音频编解码器安装lame o probe。

通常

ffmpeg -formats

要么

ffmpeg -codecs

会提供足够的信息,以便您了解更多。


11

ffmpeg -i sample.avi将为您提供文件的音频/视频格式信息。确保已配置正确的库来解析输入流。另外,请确保文件未损坏。


现在,当我使用.mkv vedio尝试相同的注释时,我得到正确的结果。为什么它不适用于.avi,是否有任何ffmpeg命令转换.avi
user1269669 2012年

1
AVI或MKV是指可以容纳许多不同音频/视频格式的容器格式。您不是要转换AVI音频,而是要转换AVI文件中的音轨,而该文件尚未指定。使用上面列出的命令查看AVI文件中包含哪种音轨。如果是MP3,则需要使用LAME lame.sourceforge.net之
smp

6

要编码mp3音频,ffmpeg.org显示以下示例:

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

我只是通过替换input.wav视频文件名来从视频中提取音频。该2装置190千字节/秒。您可以在上面的链接中看到其他质量等级。


该示例用于将音频文件转换为其他格式,而不是从视频中提取文件。
Iulian Onofrei

如我在回答中所述,@ IulianOnofrei可以将音频文件替换为视频文件。它为我工作。
苏拉奇

6

这是我刚刚使用的:

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

选项说明:

  • my.mkv是源视频文件,您也可以使用其他格式
  • -map 0:3表示我要从视频文件中获取第三流。将N放在此处-视频文件通常具有多个音频流;您可以忽略它或使用-map 0:a默认音频流。运行ffprobe my.mkv以查看视频文件具有哪些流。
  • my.mp3是目标音频文件名,ffmpeg指出我希望从扩展名中获取MP3。在我的情况下,源音频流是ac3 DTS,只是复制不是我想要的
  • 320k是理想的目标比特率
  • -vn表示我不需要目标文件中的视频

2

只是一个猜测:

-ab 192

应该

-ab 192k

似乎这可能是一个问题,但是ffmpeg可能足够聪明来纠正它。


2
有效的评论,我编辑了OP的问题以对其进行更改,但这并没有改变任何内容(最多会产生警告)。
Jean-Philippe Pellet 2014年

2

如果包装在avi中的音频不是以mp3格式开头的,则可能需要指定-acodec mp3作为附加参数。或任何mp3编解码器(可能在Linux系统上-acodec libmp3lame)。您也可以通过指定-f mp3将格式“强制”为mp3来获得与平台无关的效果,尽管并非所有ffmpeg版本仍支持该开关。你的旅费可能会改变。


2

要提取而不进行转换,我使用上下文菜单项(作为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了它,没有问题,但是,正如@LordNeckbeard在评论中说的那样,0:1不能保证Stream 始终是音频。使用-map 0:a代替流-map 0:1可以避免歧义。”


1
0:1不能保证流始终是音频。使用-map 0:a而不是-map 0:1将避免歧义。
llogan

@LordNeckbeard〜我会考虑到这一点,谢谢。

我曾经mediainfo确定音轨,并像这样选择它:-map 0:a:1其中a:1是第二音轨索引thx!-c:a copy更快了!
Aquarius

1

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

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

例如,运行:

ffmpeg -i screencap.mov screencap.mp3

mp3mov视频文件中提取音频文件。


简单而有效。为什么所有其他解决方案都这么复杂?+1
Scott Biggs,

1
问题是,为什么要进行删除表决?!
Iulian Onofrei

-1

使用-b:a的,而不是-ab-ab现在已经过时了,还请确保您的输入文件的路径是正确的。

为了从视频中提取音频,我使用了下面的命令及其正常工作。

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

这里,

  • -y -无需询问即可覆盖输出文件。
  • -i-FFmpeg从该-i选项指定的任意数量的输入“文件”中读取
  • -vn -禁用视频录制
  • -ar -设置音频流的采样率(如果已编码)
  • -ac -设置音频通道数。
  • -b:a -设置音频比特率
  • -f -格式

在我的GitHub完整示例FFmpeg android项目中查看项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.