ffmpeg从视频中提取音频

use*_*669 185 ffmpeg

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

但我输出为

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Pau*_*ish 339

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

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
Run Code Online (Sandbox Code Playgroud)
  • -vn 没有视频.
  • -acodec copy 说使用已经在那里的相同音频流.

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

  • 而不是第一次运行ffmpeg只是为了检查它是哪个音频流,使用ffprobe input-video.avi (44认同)
  • 如果仅从视频流中提取音频,则音频的长度可能短于视频的长度.为确保不会发生这种情况,请使用与ffmpeg相同的调用提取音频和视频,例如"ffmpeg -i vid.avi -map 0:audio.wav -map 0:v onlyvideo.avi (12认同)
  • 在这种精确的情况下,只需在目标路径中将".aac"替换为".m4a"即可.ffmpeg很聪明,可以猜测你的意图,并将结果封装到M4A容器中:) (5认同)
  • 使用将原始 AAC 封装到 M4A 容器中的命令来扩展此答案会很棒。 (3认同)
  • FWIW,我制作了一个 PHP 脚本,所以我只指定输入视频文件,它会自动确定输出音频文件的扩展名:https://superuser.com/questions/1301901/ffmpeg-how-to-determine -output-extension-automatically-ca-copy/1336570#1336570 (2认同)
  • `无法为 'acodec' 找到合适的输出格式... Opps 是由于 `acodec` 而不是 `-acodec`。 (2认同)
  • @FlorianB 运行 ffmpeg 是如何出现问题的?没有输出参数的“ffmpeg”不是“ffprobe”的别名吗? (2认同)

Jer*_*son 95

要从AVI编码高质量MP3最佳使用-q:a用于可变比特率:

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3
Run Code Online (Sandbox Code Playgroud)

如果要从视频中提取音频的一部分,请使用-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
Run Code Online (Sandbox Code Playgroud)
  • 时间戳需要采用HH:MM:SS.xxx格式或以秒为单位.

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

  • 注意:这是使用有损压缩重新编码音频,这会稍微降低质量。如果原始文件已经被压缩,则质量会降低两次,这可能会或可能不会被注意到。 (6认同)
  • 重新编码不是提取,所以这不能回答问题。 (3认同)
  • 这是`-q:a`值的指南:https://trac.ffmpeg.org/wiki/Encode/MP3零是最高质量的VBR设置,通常会导致理性的平均比特率CBR范围(其中最大320 kbit / s,可能超出无损压缩变得更合适的点)。 (2认同)
  • `-map a`做什么? (2认同)
  • 这个命令对我有用,而上面带有“-vn”的命令对我不起作用。 (2认同)

llo*_*gan 44

提取所有音轨/流

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

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

提取特定的音轨/流

提取音频流 #4 的示例:

ffmpeg -i input.mkv -map 0:a:3 -c copy output.m4a
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)

单独提取所有音频流

此示例中的此输入有 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
Run Code Online (Sandbox Code Playgroud)

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


提取某个频道

使用通道分离过滤器。从立体声输入获取右前 (FR) 通道的示例:

ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
Run Code Online (Sandbox Code Playgroud)
  • 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 写入标头(编解码器参数不正确?):参数无效

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


Zim*_*mba 21

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

ffmpeg.exe -i in.mp4 -vn -c:a copy out.m4a
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg.exe -i in.mp4 -vn -c:a copy -ac 2 out.m4a
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg.exe -i in.mp4 -vn -ac 2 out.mp3
Run Code Online (Sandbox Code Playgroud)

  • 如果不重新编码,您就无法缩混(或进行任何其他更改)。 (2认同)
  • @PhilGoetz:对于第一个输入文件中的第二个音频/流:`-map 0:a:1` (2认同)

小智 12

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


Álv*_*aro 12

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

平时

ffmpeg -formats
Run Code Online (Sandbox Code Playgroud)

要么

ffmpeg -codecs
Run Code Online (Sandbox Code Playgroud)

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


Sur*_*gch 7

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

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3
Run Code Online (Sandbox Code Playgroud)

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


Art*_*iev 6

这是我刚刚使用的:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3
Run Code Online (Sandbox Code Playgroud)

选项说明:

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


Ant*_*REL 6

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

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

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

选修的

  1. 如果有一个介绍,例如 40 秒,您可以使用-ss参数跳过它:
for f in *.m4a; do ffmpeg -i "$f" -ss 00:00:40  -c copy crop/"$f"; done
Run Code Online (Sandbox Code Playgroud)
  1. 要将所有文件合并为一个:
ffmpeg -f concat -safe 0 -i <(for f in ./*.m4a; do echo "file '$PWD/$f'"; done) -c copy output.m4a
Run Code Online (Sandbox Code Playgroud)


Iul*_*rei 5

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

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>
Run Code Online (Sandbox Code Playgroud)

例如,运行:

ffmpeg -i screencap.mov screencap.mp3
Run Code Online (Sandbox Code Playgroud)

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

  • 简单又有效。为什么所有其他解决方案都如此复杂?+1 (3认同)
  • @SMBiggs:因为这会重新编码音频,从而降低质量。 (3认同)
  • 问题是,为什么会有删除票?! (2认同)
  • @DanDascalescu 不知道这一点——感谢您指出这一点! (2认同)