无法使用ffmpeg从视频中提取mp3音频

Can't extract mp3 audio from video with ffmpeg

我输入的是 .mp4 视频文件。

尝试#1

ffmpeg -i pipe:0 -y -map a media/73.mp3

错误:

ffmpeg version 3.3.3 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.42)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f977d800000] stream 1, offset 0xa8: partial file
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f977d800000] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none(smpte170m/smpte170m/bt709), 320x176, 300 kb/s): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:0':
  Metadata:
major_brand     : mp42
minor_version   : 0
compatible_brands: mp42isomavc1
creation_time   : 2012-03-13T08:58:06.000000Z
encoder         : HandBrake 0.9.6 2012022800
  Duration: 00:00:10.03, bitrate: N/A
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), none(smpte170m/smpte170m/bt709), 320x176, 300 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time   : 2012-03-13T08:58:06.000000Z
  encoder         : JVT/AVC Coding
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
  creation_time   : 2012-03-13T08:58:06.000000Z
Stream #0:2(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s
Metadata:
  creation_time   : 2012-03-13T08:58:06.000000Z
Stream #0:3(und): Subtitle: mov_text (text / 0x74786574), 0 kb/s
Metadata:
  creation_time   : 2012-03-13T08:58:06.000000Z
Stream mapping:
  Stream #0:1 -> #0:0 (aac (native) -> mp3 (libmp3lame))
  Stream #0:2 -> #0:1 (aac (native) -> mp3 (libmp3lame))
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f977d800000] stream 1, offset 0xa8: partial file
pipe:0: Invalid data found when processing input
Finishing stream 0:0 without any data written to it.
Finishing stream 0:1 without any data written to it.
[mp3 @ 0x7f977b846800] Invalid audio stream. Exactly one MP3 audio stream is required.
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 -- 
Conversion failed!

尝试#2

ffmpeg -i pipe:0 -y -vn -acodec copy media/72.mp3

错误:

[...]
[mp3 @ 0x7febed835200] Invalid audio stream. Exactly one MP3 audio stream is required.
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

尝试#3

ffmpeg -i pipe:0 -y -codec:a libmp3lame -qscale:a 2 media/74.mp3

ffmpeg 没有错误,但文件无效(大小为 334 字节)


尝试#4

ffmpeg -i pipe:0 -y -vn -acodec mp3 media/78.mp3

ffmpeg 没有错误,但文件无效(大小为 334 字节)


尝试#5

ffmpeg -f mp4 -i pipe:0 -y media/80.mp3

ffmpeg 没有错误,但文件无效(大小为 334 字节)


我做错了什么?这似乎是一件相当容易的事情...

试试这个提取 .mp3:

ffmpeg -i video.mp4 -map 0:a -acodec libmp3lame out.mp3

也许这对提取有用 .m4a:

ffmpeg -i video.mp4 -map 0:a -c copy out.m4a

backendscripthttp://www.backendscript.com/blog/article/solved-ffmpeg-invalid-audio-stream-exactly-one-mp3-audio-stream-is-required

中所说的一切

An aac audio stream requires a dedicated aac container ! As a mp3 udio stream requires a dedicated mp3 container ! This error occurs when we trying to store an AAC stream in an MP3 container. To resolve this change the extension of output file from .mp3 to .aac

生成错误无效的音频流。只需要一个 MP3 音频流。

ffmpeg -i input.mp4 -vn -acodec copy output.mp3

工作正常

ffmpeg -i input.mp4 -vn -acodec copy output.aac

FFmpeg can't update metadata in WAVE files when output is written over a non-seekable protocol like a pipe. Quicktime seems to rely on metadata to determine file validity. You have to write to file or some other seekable protocol.

请参考this question