容器格式 MP3 可以包含编解码器为 ACC 的音频吗?
我知道 MP3 容器格式可以包含带有编解码器或 MP3 的音频(MP3 是一个容器和一个编解码器);我以为那是 MP3 可以包含的唯一编解码器,但我的想法却与之相矛盾。
我正在使用 ffmpeg 查看有关文件*的详细信息,并看到:
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 500x500 [SAR 1:1 DAR 1:1], 48 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, s16p, 320 kb/s (default)
看看上面说的部分Audio: mp3 (mp4a / 0x6134706D)
——mp4a
是 AAC 编解码器的 FOURCC 标识符。这说明 MP3 包含 AAC。我认为这是不可能的;这是真的吗?
*详细信息来自ffmpeg -i file.mp4
:
ffmpeg version N-45325-gb173e0353-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
libavutil 56. 9.100 / 56. 9.100
libavcodec 58. 14.100 / 58. 14.100
libavformat 58. 10.100 / 58. 10.100
libavdevice 58. 2.100 / 58. 2.100
libavfilter 7. 13.100 / 7. 13.100
libswscale 5. 0.102 / 5. 0.102
libswresample 3. 0.101 / 3. 0.101
libpostproc 55. 0.100 / 55. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'file.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.18.101
Duration: 00:05:35.76, start: 0.000000, bitrate: 376 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 500x500 [SAR 1:1 DAR 1:1], 48 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, s16p, 320 kb/s (default)
Metadata:
handler_name : SoundHandler
答案1
MP3 并不是真正的容器格式,它只是一种独立的音频压缩格式,与原始 .aac 文件非常相似。它有一个小标题来指示内容是 MP1/MP2/MP3(MPEG-1 第 I/II/III 层),但它没有一个 fourcc 字段,因此mp4a
指示必须来自其他地方。
所以我认为你是在反向解释输出——外置 MP4 容器有一个标有 fourcc 'mp4a' 的流,但在该流中,ffmpeg 发现 MP3 标头后面跟着普通 MP3 数据。如果有人使用 ,就会发生这种情况ffmpeg -i Foo.mp3 -codec copy Foo.mp4
。
(原始 AAC 流(ADTS)实际上使用类似的标头,其中显示“MPEG 版本 = 4,层 = 0”,但才不是无论如何将其设为“MP3 中的 AAC”。相反,两个标头只是共享一个共同的简介,这就是允许程序区分 AAC 数据和 MP3 数据的原因,尽管 fourcc 是错误的。)