FFMPEG如何使用LIB-FDKAAC解码

LIBFDKAAC

FFMPEG默认是用的内置的AAC解码器,而不是使用lib-fdkaac解码。可以编译debug版本的FFMPEG,然后gdb调试时直接用lib-fdkaac解码。

FFMEPG DEBUG

编译FFMPEG时,configure时加入几个选项就会编译debug版本的FFMPEG:

--disable-optimizations
--enable-debug=LEVEL
--disable-stripping

FFMPEG准备好后,就可以启动调试。

GDB DEBUG

使用GDB启动FFMPEG调试:

gdb --args ./ffmpeg_g -i input.flv -acodec pcm_s16le -vn -y audio.pcm_s16le.wav

设置断点:

b avcodec_find_decoder
b fdk_aac_decode_frame

由于FFMPEG内部用的aac decoder,不是用的fdkaac解码,所以需要调试时在函数avcodec_find_decoder中修改decoder(注意会多次进入):

return &ff_libfdk_aac_decoder

这样就会使用fdkaac解码:

(gdb) bt
#0  fdk_aac_decode_frame  at libavcodec/libfdk-aacdec.c:216
#1  0x0000000000ae298b in avcodec_decode_audio4  at libavcodec/utils.c:2204
#2  0x00000000005e9350 in try_decode_frame  at libavformat/utils.c:2519
#3  0x00000000005eb1e5 in avformat_find_stream_info at libavformat/utils.c:2978
#4  0x0000000000408182 in open_input_file at ffmpeg_opt.c:818
#5  0x000000000040f82a in open_files at ffmpeg_opt.c:2506
#6  0x000000000040f986 in ffmpeg_parse_options at ffmpeg_opt.c:2543
#7  0x00000000004200a4 in main at ffmpeg.c:3430

接下来就是对比了。

REMARK

LIB-FDKAAC解码一共有几个个坑:

  1. FILL时,那个valid必须初始化为size。
  2. 只有ADTS才能部分的FILL,RAW方式,必须每次FILL完整的包。
  3. 采样单月固定为16bits,也就是单声道每个采样是2字节,双声道采样是4字节。
  4. 解码出来第一个PCM全部是0。
  5. 如果Decode时,缓冲区只有四个字节了,会导致失败。
  6. FDKAAC是没有cache的,所以fdk_aac_decode_flush是直接调用callback。

END

你可能感兴趣的:(直播和WebRTC)