453

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

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

有人可以帮忙吗?

4

13 回答 13

646

要在不重新编码的情况下提取音频流:

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

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

于 2014-12-11T01:18:35.417 回答
267

要从电影文件(例如 AVI、MP4、MOV 等)或音频文件(例如 WAV)中编码高质量的 MP3 或 MP4 音频,我发现最好使用-q:a 0可变比特率,并且最好指定-map a排除视频/subtitles 并且只抓取音频:

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选项,它将走到最后。

  • 如果您想指定范围,例如 45 秒,您可以使用-to选项而不是-t选项:00:03:05 + 45 = 00:03:50

工作示例:

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

视窗 在此处输入图像描述

Mac/Linux 在此处输入图像描述 在此处输入图像描述

于 2016-03-31T05:18:18.290 回答
63

提取所有音轨/流

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

ffmpeg -i input.mov -map 0:a -c copy output.mov
  • -map 0:a仅选择所有音频流。视频和字幕将被排除在外。
  • -c copy启用流复制模式。这会复制音频并且不会对其进行重新编码。-c copy如果您想要重新编码音频,请移除。
  • 选择支持您的音频格式的输出格式。请参阅容器格式的比较

提取特定的音轨/流

提取音频流 #4 的示例:

ffmpeg -i input.mkv -map 0:a:3 -c copy output.m4a
  • -map 0:a:3仅选择音频流 #4(ffmpeg从 0 开始计数)。
  • -c copy启用流复制模式。这会复制音频并且不会对其进行重新编码。-c copy如果您想要重新编码音频,请移除。
  • 选择支持您的音频格式的输出格式。请参阅容器格式的比较

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

与上面的示例类似,但没有-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以启用流复制模式。


提取某个频道

使用通道分割过滤器。从立体声输入获取右前 (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)。
  • 过滤时无法使用流复制模式( ),因此必须重新编码音频。-c copy
  • 有关更多示例,请参阅FFmpeg Wiki:音频通道

-map和有什么区别-vn

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

-vn是一个旧的遗留选项。它从默认流选择行为中排除视频。因此,音频、字幕和数据仍会自动选择,除非用 、 或 告知-an-sn要这样做-dn

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

有关更多示例,请参阅FFmpeg Wiki:地图


错误

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

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

WAVE 文件只有一个流

与上面类似。

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

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

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

请参阅容器格式的比较

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

这是一个无用的通用错误。实际的、信息丰富的错误应立即出现在此通用错误消息之前。

于 2020-08-03T22:42:40.103 回答
30

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

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

将音频和缩混提取为立体声(无需重新编码):

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

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

ffmpeg.exe -i in.mp4 -vn -ac 2 out.mp3
于 2021-02-09T13:41:59.750 回答
12

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

通常

ffmpeg -formats

或者

ffmpeg -codecs

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

于 2012-03-29T06:32:17.790 回答
11

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

于 2012-03-28T17:55:34.120 回答
9

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

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

input.wav我只是通过替换视频文件名来从视频中提取音频。这2意味着 190 kb/秒。您可以在我上面的链接中查看其他质量级别。

于 2016-12-13T06:28:33.500 回答
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 表示我不想要目标文件中的视频
于 2019-01-26T16:12:19.747 回答
6

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

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

例如,运行:

ffmpeg -i screencap.mov screencap.mp3

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

于 2018-09-22T13:48:56.237 回答
4

从多个视频剪辑创建有声读物

  1. 首先,从一堆 h264 文件中提取音频(作为 `.m4a):
for f in *.mp4; do ffmpeg -i "$f" -vn -c:a copy "$(basename "$f" .mp4).m4a"; done

-vn输出选项禁用视频输出(任何视频流的自动选择或映射)。如需完全手动控制,请参阅-map选项。

可选的

  1. 如果有 40 秒的介绍,您可以使用-ss参数跳过它:
for f in *.m4a; do ffmpeg -i "$f" -ss 00:00:40  -c copy crop/"$f"; done
  1. 要将所有文件合并为一个:
ffmpeg -f concat -safe 0 -i <(for f in ./*.m4a; do echo "file '$PWD/$f'"; done) -c copy output.m4a
于 2021-09-07T22:02:21.013 回答
2

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

于 2014-10-28T21:41:01.247 回答
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不能保证流始终是音频。使用-map 0:a代替-map 0:1将避免歧义。”

于 2018-05-17T10:17:31.447 回答
0

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

要从视频中提取音频,我使用了下面的命令并且工作正常。

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

这里,

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

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

于 2017-04-08T13:22:24.740 回答