使用 ffmpeg API 处理文件时发现无效数据

Tim*_*y K 4 android ffmpeg decode aac

我有一个 m4a 文件,其中包含两个 AAC 编码的音频流。我想在 Android 上使用 ffmpeg 库对其进行解码。但是,avformat_open_input() 失败并显示“处理输入时发现无效数据”。

该文件是使用相同的库创建的(即编码的音频数据)。

我已经仔细检查了提供给调用的文件路径的准确性。

该文件似乎没有损坏。它使用 QuickTime 播放器播放,ffprobe 报告以下输出。

我查看了 ffmpeg 的 utils.c 中的源代码,但不清楚文件中数据的无效性是在哪几个点(包括嵌套调用)中决定的。

FFPROBE OUTPUT
built with gcc 7.2.0 (crosstool-NG fa8859cb)
configuration: --prefix=/home/ubuntu/miniconda3 --disable-doc --enable- 
shared --extra-cflags='-fPIC -I/home/ubuntu/miniconda3/include' --extra-
cxxflags='=-fPIC' --extra-libs='-L/home/ubuntu/miniconda3/lib -lz' --enable-
pic --disable-static --disable-gpl --disable-nonfree --disable-openssl --
enable-libvpx --cc=/opt/conda/conda- 
bld/ffmpeg_1530807717919/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc --cxx=/opt/conda/conda-bld/ffmpeg_1530807717919/_build_env/bin/x86_64-conda_cos6-linux-gnu-c++ --enable-libopus
    libavutil            55. 78.100 / 55. 78.100
    libavcodec         57.107.100 / 57.107.100
    libavformat        57. 83.100 / 57. 83.100
    libavdevice        57. 10.100 / 57. 10.100
    libavfilter         6.107.100 /    6.107.100
    libswscale            4.    8.100 /    4.    8.100
    libswresample     2.    9.100 /    2.    9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'recording-2019-09-03-110626.m4a':
    Metadata:
        major_brand         : isom
        minor_version     : 512
        compatible_brands: isomiso2mp41
        encoder                 : Lavf58.27.103
    Duration: 00:00:05.04, start: 0.000000, bitrate: 637 kb/s
        Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 314 kb/s (default)
        Metadata:
            handler_name        : SoundHandler
        Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 315 kb/s (default)
        Metadata:
            handler_name        : SoundHandler
Run Code Online (Sandbox Code Playgroud)

因“发现无效数据”而失败的调用是:

 if ( (ret = avformat_open_input( &inputFormatContext, filePath, 0, 0)) < 0 )
  {
    __android_log_print(ANDROID_LOG_DEBUG, "MyTag", "Could not open input file '%s' error %s ", filePath, av_err2str(ret) );
      return false;
  }
Run Code Online (Sandbox Code Playgroud)

我希望这能“正常工作”,因为我使用相同版本的 ffmpeg 库对两个音轨进行了编码和混合。

当我构建库时,我使用以下命令配置了构建:

--enable-decoder=aac,pcm_s16le --enable-encoder=aac,pcm_s16le --enable-demuxer=mp4,wav --enable-muxer=mp4,wav --enable-protocol=文件,http

当我使用 av_codec_iterate() 迭代编解码器并查找支持的采样率时,我看到:

Found codec aac
supported sample rate 96000
supported sample rate 88200
supported sample rate 64000
supported sample rate 48000
supported sample rate 44100
supported sample rate 32000
supported sample rate 24000
supported sample rate 22050
supported sample rate 16000
supported sample rate 12000
supported sample rate 11025
supported sample rate 8000
supported sample rate 7350
Found codec pcm_s16le
Found codec aac
Found codec pcm_s16le 
Run Code Online (Sandbox Code Playgroud)

每个编解码器出现两次,我认为可能是编码器和解码器。但我注意到只有一个具有受支持的采样率。我的测试文件的采样率为44100。

关于我还可以检查哪些其他事情有什么想法吗?我想知道是否应该根据我对文件内容的了解,创建 AVInputFormat 对象并将其显式传递给调用。但我不知道如何构建一个。

aer*_*tal 6

在配置选项中,您必须使用--enable-demuxer=mov而不是--enable-demuxer=mp4. 后者不匹配任何解复用器。