ffmpeg从视频中提取音频

时间:2012-03-28 17:51:39

标签: ffmpeg

我尝试了以下命令从视频中提取音频:
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

有人可以帮忙吗?

14 个答案:

答案 0 :(得分:317)

提取音频流而不重新编码:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn不是视频。
  • -acodec copy表示使用已经存在的相同音频流。

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

答案 1 :(得分:89)

要从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 选项,则会结束。

答案 2 :(得分:15)

似乎您正在从视频文件中提取音频并缩混到立体声通道。
仅提取音频(无需重新编码):

ffmpeg.exe -i in.mp4 -vn -c:a copy out.m4a

提取音频和downmix to stereo(无需重新编码):

ffmpeg.exe -i in.mp4 -vn -c:a copy -ac 2 out.m4a

要生成 mp3 文件,您需要重新编码音频:

ffmpeg.exe -i in.mp4 -vn -ac 2 out.mp3

答案 3 :(得分:14)

提取所有音轨/流

这会将所有音频放入一个文件中

ffmpeg -i input.mov -map 0:a -c copy output.mov
  • -map 0:a仅选择所有音频流。视频和字幕将被排除。
  • -c copy启用stream copy模式。这将复制音频,并且不会重新编码。如果您想重新编码音频,请删除-c copy
  • 选择一种支持您的音频格式的输出格式。参见comparison of container formats

提取特定音轨/流

提取音频流#4的示例:

ffmpeg -i input.mkv -map 0:a:3 -c copy output.m4a
  • -map 0:a:3仅选择音频流#4(ffmpeg从0开始计数。)
  • -c copy启用stream copy模式。这将复制音频,并且不会重新编码。如果您想重新编码音频,请删除-c copy
  • 选择一种支持您的音频格式的输出格式。参见comparison of container formats

提取并重新编码音频/更改格式

类似于以上示例,但没有-c copy。各种示例:

ffmpeg -i input.mp4 -map 0:a output.mp3
ffmpeg -i input.mkv -map 0:a output.m4a
ffmpeg -i input.avi -map 0:a -c:a aac output.mka
ffmpeg -i input.mp4 output.wav

分别提取所有音频流

在此示例中,此输入具有4个音频流。每个音频流将作为单个文件输出。

ffmpeg -i input.mov -map 0:a:0 output0.wav -map 0:a:1 output1.wav -map 0:a:2 output2.wav -map 0:a:3 output3.wav

(可选)在每个输出文件名之前添加-c copy,以启用stream copy模式。


提取某个频道

使用channelsplit filter。从立体声输入获取前右(FR)通道的示例:

ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
  • channel_layout是输入的通道布局。不会自动检测到它,因此您必须提供布局名称。
  • channels列出了您要提取的频道。
  • 有关音频通道布局名称(针对ffmpeg -layouts)和通道名称(针对channel_layout),请参见channels
  • 在过滤时无法使用stream copy模式(-c copy),因此必须对音频进行重新编码。
  • 有关更多示例,请参见FFmpeg Wiki: Audio Channels

-map-vn有什么区别?

ffmpeg具有默认的stream selection行为,它将为每种流类型选择1个流(1个视频,1个音频,1个字幕,1个数据)。

-vn是旧的旧选项。它从默认的流选择行为中排除视频。因此,除非使用-an-sn-dn来告知不要,否则音频,字幕和数据仍会自动选择。

-map更复杂,但更灵活,更有用。 -map禁用默认的流选择行为,并且ffmpeg仅包含您使用-map选项告诉它的内容。 -map也可以用于排除某些流或流类型。例如,-map 0 -map -0:v将包括所有流除外所有视频。

有关更多示例,请参见FFmpeg Wiki: Map


错误

无效的音频流。只需一个MP3音频流。

MP3仅支持1个音频流。该错误表示您正在尝试将多个音频流放入MP3。这也可能意味着您正在尝试将非MP3音频放入MP3。

WAVE文件只有一个流

类似于以上。

在流#0中找不到编解码器的标签,容器中当前不支持编解码器

您正在尝试将音频格式放入不支持的音频输出中,例如将PCM(WAV)插入MP4。

删除-c copy,选择其他输出格式(更改文件扩展名),或手动选择编码器(例如-c:a aac)。

请参见comparison of container formats

无法写入输出文件#0的标头(编解码器参数不正确?):参数无效

这是一个无用的通用错误。实际的信息错误应在此一般错误消息之前。

答案 4 :(得分:11)

命令行是正确的,适用于有效的视频文件。我会确保你安装了正确的库来使用mp3,用另一个音频编解码器安装lame o probe。

一般

ffmpeg -formats

ffmpeg -codecs

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

答案 5 :(得分:10)

ffmpeg -i sample.avi会为您提供文件的音频/视频格式信息。确保配置了正确的库以解析输入流。此外,请确保该文件没有损坏。

答案 6 :(得分:6)

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

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

我只是将input.wav替换为视频文件名,从视频中提取音频。 2表示190 kb /秒。您可以在上面的链接中查看其他质量级别。

答案 7 :(得分:2)

只是一个猜测:

-ab 192

应该是

-ab 192k

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

答案 8 :(得分:2)

如果包含在avi中的音频不是mp3格式,您可能需要指定-acodec mp3作为附加参数。或者你的mp3编解码器是什么(在Linux系统上它可能是-acodec libmp3lame)。您也可以通过指定-f mp3将“格式”强制为mp3来获得与平台无关的相同效果,尽管并非所有版本的ffmpeg仍然支持该切换。你的里程可能会变化。

答案 9 :(得分: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:一

设置音频比特率

-f

格式

在github上查看this我的完整示例ffmpeg android项目。

答案 10 :(得分:1)

要在不进行转换的情况下提取,我使用上下文菜单条目 - 在Linux中作为文件管理器自定义操作 - 运行以下内容(在检查了视频包含的音频类型之后;包含ogg音频的视频示例):< / p>

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并不能保证始终是音频。使用{{1}而不是-map 0:a将避免歧义。“

答案 11 :(得分:0)

这就是我刚刚使用的内容:

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表示我不需要目标文件中的视频

答案 12 :(得分:0)

这就是我刚刚使用的内容:

ffmpeg -i input.mkv -ss 01:06:57 -to 01:21:07 -c:v copy -c:a copy output.mp4

参考:https://www.arj.no/2018/05/18/trimvideo/

答案 13 :(得分:-1)

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

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

例如,运行:

ffmpeg -i screencap.mov screencap.mp3

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

相关问题