FFmpeg AAC编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg AAC编码相关的知识,希望对你有一定的参考价值。

参考技术A 通过FFmpeg进行AAC编码步骤如下:
1.通过名字 libfdk_aac 找到AAC编码器。
2.创建编码上下文环境,并设置上下文的参数(比特率、采样大小、采样率、声道数等信息)。
3.创建并打开输出文件,打开编码器,对帧数据进行编码处理(实际应用中原始帧数据是来自麦克风或解码后的音频,这里是人工添加的模拟数据)。
4.将帧数据编码后的包写进文件。

编码aac音轨时FFmpeg媒体信息不正确

【中文标题】编码aac音轨时FFmpeg媒体信息不正确【英文标题】:FFmpeg media info incorrect when encoding aac audio track 【发布时间】:2020-03-29 06:53:18 【问题描述】:

我最近涉足使用 FFmpeg 进行编码。除了我最近注意到的表格 1 问题外,它对我来说一直很好。当我尝试重新编码音轨以 acc 媒体信息标签有些错误。比特率、流大小等似乎是从源中复制的,而不是从新轨道中读取的。

基本上我想复制源视频、音频和字幕,并创建一个 AAC 版本的音轨,以便在不支持高清音频的设备上播放。

下面是我正在做的一个例子:

ffmpeg -i source.mkv -map_chapters 0 -map 0:v -c:v copy -c:s copy -map 0:a -c:a:0 copy -map 0:a c:a:1 aac destination.mkv

这会产生以下媒体信息:

Audio #1
ID                                       : 2
Format                                   : MLP FBA 16-ch
Format/Info                              : Meridian Lossless Packing FBA with 16-channel presentation
Commercial name                          : Dolby TrueHD with Dolby Atmos
Codec ID                                 : A_TRUEHD
Duration                                 : 1 h 50 min
Bit rate mode                            : Variable
Bit rate                                 : 3 545 kb/s
Maximum bit rate                         : 5 826 kb/s
Channel(s)                               : 8 channels
Channel layout                           : L R C LFE Ls Rs Lb Rb
Sampling rate                            : 48.0 kHz
Frame rate                               : 1 200.000 FPS (40 SPF)
Bit depth                                : 24 bits
Compression mode                         : Lossless
Delay relative to video                  : 21 ms
Stream size                              : 2.73 GiB (29%)
Title                                    : Dolby TrueHD 7.1 (Atmos)
Language                                 : English
Default                                  : Yes
Forced                                   : No
Number of dynamic objects                : 11
Bed channel count                        : 1 channel
Bed channel configuration                : LFE

Audio #2
ID                                       : 3
Format                                   : AAC LC
Format/Info                              : Advanced Audio Codec Low Complexity
Codec ID                                 : A_AAC-2
Duration                                 : 1 h 50 min
Bit rate                                 : 3 545 kb/s
Channel(s)                               : 8 channels
Channel layout                           : C L R Ls Rs Lb Rb LFE
Sampling rate                            : 48.0 kHz
Frame rate                               : 46.875 FPS (1024 SPF)
Compression mode                         : Lossy
Stream size                              : 2.73 GiB (29%)
Title                                    : AAC 5.1
Writing library                          : Lavc58.62.100 aac
Language                                 : English
Default                                  : Yes
Forced                                   : No

如您所见,比特率、流大小等是从不正确的源轨道复制而来的。我已经尝试过 -map_metadata -1 但这会删除元数据而不创建新元数据,并且还会从我不想要的所有视频和音频轨道中删除它。

任何其他想法我做错了什么或者这只是软件的一个怪癖?

提前致谢。

添加 -report 输出修剪“Writing block of size...”行,因为文件很大:

ffmpeg started on 2019-12-04 at 14:31:25
Report written to "ffmpeg-20191204-143125.log"
Log level: 48
Command line:
"C:\\ffmpeg\\ffmpeg-20191118-d831edc-win64-static\\bin\\ffmpeg" -i input.mkv -report -map_chapters 0 -map 0:v -c:v copy -c:s copy -map 0:a -c:a:0 copy -map 0:a -c:a:1 aac destination.mkv
ffmpeg version git-2019-11-18-d831edc Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20191010
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 36.100 / 56. 36.100
  libavcodec     58. 62.100 / 58. 62.100
  libavformat    58. 35.100 / 58. 35.100
  libavdevice    58.  9.101 / 58.  9.101
  libavfilter     7. 66.100 /  7. 66.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
Splitting the commandline.
Reading option '-i' ... matched as input url with argument 'input.mkv'.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Reading option '-map_chapters' ... matched as option 'map_chapters' (set chapters mapping) with argument '0'.
Reading option '-map' ... matched as option 'map' (set input stream mapping) with argument '0:v'.
Reading option '-c:v' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option '-c:s' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option '-map' ... matched as option 'map' (set input stream mapping) with argument '0:a'.
Reading option '-c:a:0' ... matched as option 'c' (codec name) with argument 'copy'.
Reading option '-map' ... matched as option 'map' (set input stream mapping) with argument '0:a'.
Reading option '-c:a:1' ... matched as option 'c' (codec name) with argument 'aac'.
Reading option 'destination.mkv' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input url input.mkv.
Successfully parsed a group of options.
Opening an input file: input.mkv.
[NULL @ 000001b290ddad00] Opening 'input.mkv' for reading
[file @ 000001b290ddbe00] Setting default whitelist 'file,crypto'
[matroska,webm @ 000001b290ddad00] Format matroska,webm probed with size=2048 and score=100
st:0 removing common factor 1000000 from timebase
st:1 removing common factor 1000000 from timebase
[matroska,webm @ 000001b290ddad00] Before avformat_find_stream_info() pos: 5080 bytes read:32768 seeks:0 nb_streams:2
[hevc @ 000001b290ddeb80] nal_unit_type: 32(VPS), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding VPS
[hevc @ 000001b290ddeb80] Main 10 profile bitstream
[hevc @ 000001b290ddeb80] nal_unit_type: 33(SPS), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding SPS
[hevc @ 000001b290ddeb80] Main 10 profile bitstream
[hevc @ 000001b290ddeb80] Decoding VUI
[hevc @ 000001b290ddeb80] nal_unit_type: 34(PPS), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding PPS
[hevc @ 000001b290ddeb80] nal_unit_type: 39(SEI_PREFIX), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding SEI
[hevc @ 000001b290ddeb80] nal_unit_type: 39(SEI_PREFIX), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding SEI
[hevc @ 000001b290ddeb80] nal_unit_type: 39(SEI_PREFIX), nuh_layer_id: 0, temporal_id: 0
[hevc @ 000001b290ddeb80] Decoding SEI
[hevc @ 000001b290ddeb80] Skipped PREFIX SEI 5
[matroska,webm @ 000001b290ddad00] All info found
[matroska,webm @ 000001b290ddad00] After avformat_find_stream_info() pos: 10219 bytes read:32768 seeks:0 frames:4
Input #0, matroska,webm, from 'input.mkv':
  Metadata:
    title           : input
    ENCODER         : Lavf58.35.100
  Duration: 01:50:06.89, start: 0.000000, bitrate: 11569 kb/s
    Chapter #0:0: start 0.000000, end 308.766792
    Metadata:
      title           : Chapter 01
    Chapter #0:1: start 308.766792, end 679.720708
    Metadata:
      title           : Chapter 02
    Chapter #0:2: start 679.720708, end 904.820583
    Metadata:
      title           : Chapter 03
    Chapter #0:3: start 904.820583, end 1282.781500
    Metadata:
      title           : Chapter 04
    Chapter #0:4: start 1282.781500, end 1487.736250
    Metadata:
      title           : Chapter 05
    Chapter #0:5: start 1487.736250, end 1846.177667
    Metadata:
      title           : Chapter 06
    Chapter #0:6: start 1846.177667, end 2116.531083
    Metadata:
      title           : Chapter 07
    Chapter #0:7: start 2116.531083, end 2443.858083
    Metadata:
      title           : Chapter 08
    Chapter #0:8: start 2443.858083, end 2731.979250
    Metadata:
      title           : Chapter 09
    Chapter #0:9: start 2731.979250, end 3178.383542
    Metadata:
      title           : Chapter 10
    Chapter #0:10: start 3178.383542, end 3636.507875
    Metadata:
      title           : Chapter 11
    Chapter #0:11: start 3636.507875, end 3867.488625
    Metadata:
      title           : Chapter 12
    Chapter #0:12: start 3867.488625, end 4208.037167
    Metadata:
      title           : Chapter 13
    Chapter #0:13: start 4208.037167, end 4502.372875
    Metadata:
      title           : Chapter 14
    Chapter #0:14: start 4502.372875, end 4853.431917
    Metadata:
      title           : Chapter 15
    Chapter #0:15: start 4853.431917, end 5267.470542
    Metadata:
      title           : Chapter 16
    Chapter #0:16: start 5267.470542, end 5543.329458
    Metadata:
      title           : Chapter 17
    Chapter #0:17: start 5543.329458, end 5847.132958
    Metadata:
      title           : Chapter 18
    Chapter #0:18: start 5847.132958, end 6150.269125
    Metadata:
      title           : Chapter 19
    Chapter #0:19: start 6150.269125, end 6606.891958
    Metadata:
      title           : Chapter 20
    Stream #0:0, 3, 1/1000: Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x1600 [SAR 1:1 DAR 12:5], 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc
    Metadata:
      title           : input
      ENCODER         : Lavc58.62.100 libx265
      DURATION        : 01:50:06.891000000
    Stream #0:1(eng), 1, 1/1000: Audio: truehd, 48000 Hz, 7.1, s32 (24 bit) (default)
    Metadata:
      title           : input
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      BPS-eng         : 3544728
      DURATION-eng    : 01:50:06.893000000
      NUMBER_OF_FRAMES-eng: 7928271
      NUMBER_OF_BYTES-eng: 2927455224
      _STATISTICS_WRITING_APP-eng: mkvmerge v40.0.0 ('Old Town Road + Pony') 64-bit
      _STATISTICS_WRITING_DATE_UTC-eng: 2019-11-30 10:59:25
      DURATION        : 01:50:06.893000000
Successfully opened the file.
Parsing a group of options: output url destination.mkv.
Applying option map_chapters (set chapters mapping) with argument 0.
Applying option map (set input stream mapping) with argument 0:v.
Applying option c:v (codec name) with argument copy.
Applying option c:s (codec name) with argument copy.
Applying option map (set input stream mapping) with argument 0:a.
Applying option c:a:0 (codec name) with argument copy.
Applying option map (set input stream mapping) with argument 0:a.
Applying option c:a:1 (codec name) with argument aac.
Successfully parsed a group of options.
Opening an output file: destination.mkv.
[file @ 000001b290ea7e40] Setting default whitelist 'file,crypto'
Successfully opened the file.
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:1 -> #0:2 (truehd (native) -> aac (native))
Press [q] to stop, [?] for help
cur_dts is invalid st:0 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:2 (0) [init:0 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:2 (0) [init:0 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:2 (0) [init:0 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:2 (0) [init:0 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
detected 12 logical cores
[graph_0_in_0_1 @ 000001b290dda840] Setting 'time_base' to value '1/48000'
[graph_0_in_0_1 @ 000001b290dda840] Setting 'sample_rate' to value '48000'
[graph_0_in_0_1 @ 000001b290dda840] Setting 'sample_fmt' to value 's32'
[graph_0_in_0_1 @ 000001b290dda840] Setting 'channel_layout' to value '0x63f'
[graph_0_in_0_1 @ 000001b290dda840] tb:1/48000 samplefmt:s32 samplerate:48000 chlayout:0x63f
[format_out_0_2 @ 000001b290e0ea00] Setting 'sample_fmts' to value 'fltp'
[format_out_0_2 @ 000001b290e0ea00] Setting 'sample_rates' to value '96000|88200|64000|48000|44100|32000|24000|22050|16000|12000|11025|8000|7350'
[format_out_0_2 @ 000001b290e0ea00] auto-inserting filter 'auto_resampler_0' between the filter 'Parsed_anull_0' and the filter 'format_out_0_2'
[AVFilterGraph @ 000001b290e1b3c0] query_formats: 4 queried, 6 merged, 3 already done, 0 delayed
[auto_resampler_0 @ 000001b290e0fe80] [SWR @ 000001b291232000] Using fltp internally between filters
[auto_resampler_0 @ 000001b290e0fe80] ch:8 chl:7.1 fmt:s32 r:48000Hz -> ch:8 chl:7.1 fmt:fltp r:48000Hz
[matroska @ 000001b290dfba40] get_metadata_duration returned: 6606893000
[matroska @ 000001b290dfba40] Write early duration from metadata = 6606893
Output #0, matroska, to 'destination.mkv':
  Metadata:
    title           : input
    encoder         : Lavf58.35.100
    Chapter #0:0: start 0.000000, end 308.766792
    Metadata:
      title           : Chapter 01
    Chapter #0:1: start 308.766792, end 679.720708
    Metadata:
      title           : Chapter 02
    Chapter #0:2: start 679.720708, end 904.820583
    Metadata:
      title           : Chapter 03
    Chapter #0:3: start 904.820583, end 1282.781500
    Metadata:
      title           : Chapter 04
    Chapter #0:4: start 1282.781500, end 1487.736250
    Metadata:
      title           : Chapter 05
    Chapter #0:5: start 1487.736250, end 1846.177667
    Metadata:
      title           : Chapter 06
    Chapter #0:6: start 1846.177667, end 2116.531083
    Metadata:
      title           : Chapter 07
    Chapter #0:7: start 2116.531083, end 2443.858083
    Metadata:
      title           : Chapter 08
    Chapter #0:8: start 2443.858083, end 2731.979250
    Metadata:
      title           : Chapter 09
    Chapter #0:9: start 2731.979250, end 3178.383542
    Metadata:
      title           : Chapter 10
    Chapter #0:10: start 3178.383542, end 3636.507875
    Metadata:
      title           : Chapter 11
    Chapter #0:11: start 3636.507875, end 3867.488625
    Metadata:
      title           : Chapter 12
    Chapter #0:12: start 3867.488625, end 4208.037167
    Metadata:
      title           : Chapter 13
    Chapter #0:13: start 4208.037167, end 4502.372875
    Metadata:
      title           : Chapter 14
    Chapter #0:14: start 4502.372875, end 4853.431917
    Metadata:
      title           : Chapter 15
    Chapter #0:15: start 4853.431917, end 5267.470542
    Metadata:
      title           : Chapter 16
    Chapter #0:16: start 5267.470542, end 5543.329458
    Metadata:
      title           : Chapter 17
    Chapter #0:17: start 5543.329458, end 5847.132958
    Metadata:
      title           : Chapter 18
    Chapter #0:18: start 5847.132958, end 6150.269125
    Metadata:
      title           : Chapter 19
    Chapter #0:19: start 6150.269125, end 6606.891958
    Metadata:
      title           : Chapter 20
    Stream #0:0, 0, 1/1000: Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x1600 [SAR 1:1 DAR 12:5], q=2-31, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc
    Metadata:
      title           : input
      ENCODER         : Lavc58.62.100 libx265
      DURATION        : 01:50:06.891000000
    Stream #0:1(eng), 0, 1/1000: Audio: truehd ([255][255][255][255] / 0xFFFFFFFF), 48000 Hz, 7.1, s32 (24 bit) (default)
    Metadata:
      title           : input
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      BPS-eng         : 3544728
      DURATION-eng    : 01:50:06.893000000
      NUMBER_OF_FRAMES-eng: 7928271
      NUMBER_OF_BYTES-eng: 2927455224
      _STATISTICS_WRITING_APP-eng: mkvmerge v40.0.0 ('Old Town Road + Pony') 64-bit
      _STATISTICS_WRITING_DATE_UTC-eng: 2019-11-30 10:59:25
      DURATION        : 01:50:06.893000000
    Stream #0:2(eng), 0, 1/1000: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, 7.1, fltp (24 bit), 469 kb/s (default)
    Metadata:
      title           : input
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      BPS-eng         : 3544728
      DURATION-eng    : 01:50:06.893000000
      NUMBER_OF_FRAMES-eng: 7928271
      NUMBER_OF_BYTES-eng: 2927455224
      _STATISTICS_WRITING_APP-eng: mkvmerge v40.0.0 ('Old Town Road + Pony') 64-bit
      _STATISTICS_WRITING_DATE_UTC-eng: 2019-11-30 10:59:25
      DURATION        : 01:50:06.893000000
      encoder         : Lavc58.62.100 aac
cur_dts is invalid st:2 (0) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)

....................
....................
[matroska @ 000001b290dfba40] Writing block of size 168 with pts 6606913, dts 6606913, duration 1 at relative offset 550755 in cluster at offset 9940898622. TrackNumber 2, keyframe 1
[matroska @ 000001b290dfba40] end duration = 6606914
[matroska @ 000001b290dfba40] stream 0 end duration = 6606912
[matroska @ 000001b290dfba40] stream 1 end duration = 6606914
[matroska @ 000001b290dfba40] stream 2 end duration = 6606914
frame=158407 fps=357 q=-1.0 Lsize= 9708475kB time=01:50:06.91 bitrate=12037.7kbits/s speed=14.9x    
video:6416483kB audio:3234397kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.596787%
Input file #0 (input.mkv):
  Input stream #0:0 (video): 158407 packets read (6570478730 bytes); 
  Input stream #0:1 (audio): 7928271 packets read (2927455224 bytes); 7928271 frames decoded (317130840 samples); 
  Total: 8086678 packets (9497933954 bytes) demuxed
Output file #0 (destination.mkv):
  Output stream #0:0 (video): 158407 packets muxed (6570478730 bytes); 
  Output stream #0:1 (audio): 7928271 packets muxed (2927455224 bytes); 
  Output stream #0:2 (audio): 309699 frames encoded (317130840 samples); 309700 packets muxed (384567176 bytes); 
  Total: 8396378 packets (9882501130 bytes) muxed
7928271 frames successfully decoded, 0 decoding errors
[AVIOContext @ 000001b291230100] Statistics: 8 seeks, 39676 writeouts
[aac @ 000001b290dff3c0] Qavg: 3839.668
[AVIOContext @ 000001b290de4080] Statistics: 9554742230 bytes read, 0 seeks

【问题讨论】:

添加-report并运行;分享报告 报告已添加到原始帖子中。 【参考方案1】:

您需要分两步完成。

ffmpeg -i source.mkv -map 0:a -c:a aac -map_metadata -1 temp.mkv

ffmpeg -i source.mkv -i temp.mkv -map_chapters 0 -map 0:v -map 0:a -map 1:a -c copy destination.mkv

【讨论】:

这在一定程度上起到了作用。只是生成的音轨的媒体信息中根本没有比特率。 不会有。 Mediainfo 显示的原始比特率是一个已被删除的文本标签。这些文本标签特定于 mkvtoolnix。 哦,有趣。我认为这将是 ffmpeg 嵌入的东西。我不知道。再次感谢您的帮助。

以上是关于FFmpeg AAC编码的主要内容,如果未能解决你的问题,请参考以下文章

编码aac音轨时FFmpeg媒体信息不正确

最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

FFmpeg API进行AAC编码

ffmpeg编码aac文件通过extradata添加adts头

音频压缩编码技术—ffmpeg命令方式生成AAC文件

音频压缩编码技术—ffmpeg命令方式生成AAC文件