FFmpeg C API WMAV2 AVCodecParserContext not found even though CLI can parse WMAs on MacOS

128 Views Asked by At

I am following the decode_audio.c example from FFmpeg, but I am unable to initialize a parser for AV_CODEC_ID_WMAV2.

Test code:

#include <stdio.h>
#include <libavcodec/avcodec.h>

int main() {
    // codec is found successfully
    const AVCodec * codec = avcodec_find_decoder(AV_CODEC_ID_WMAV2);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        return 1;
    }

    // parser is always NULL
    AVCodecParserContext * parser = av_parser_init(codec->id);
    if (!parser) {
        fprintf(stderr, "parser not found\n");
        return 1;
    }

    av_parser_close(parser);
    return 0;
}

Build commands:

clang -c -I/opt/homebrew/Cellar/ffmpeg/6.0_1/include wma2mp3.c -o obj/wma2mp3.o
clang -L/opt/homebrew/Cellar/ffmpeg/6.0_1/lib -lavcodec obj/wma2mp3.o -o wma2mp3

I'm surprised by the fact that the FFmpeg CLI can perform this operation on the same machine:

% ffmpeg -i test.wma test.mp3
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
  built with Apple clang version 14.0.3 (clang-1403.0.22.14.1)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/6.0_1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
  libpostproc    57.  1.100 / 57.  1.100
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, asf, from 'test.wma':
  Metadata:
    ToolName        : Windows Media Encoding Utility
    ToolVersion     : 8.00.00.0343
  Duration: 00:00:00.74, start: 0.000000, bitrate: 80 kb/s
  Stream #0:0: Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, 1 channels, fltp, 48 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (wmav2 (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to 'test.mp3':
  Metadata:
    ToolName        : Windows Media Encoding Utility
    ToolVersion     : 8.00.00.0343
    TSSE            : Lavf60.3.100
  Stream #0:0: Audio: mp3, 44100 Hz, mono, fltp
    Metadata:
      encoder         : Lavc60.3.100 libmp3lame
[libmp3lame @ 0x130706320] Queue input is backward in timeed=N/A    
[mp3 @ 0x1307056e0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 15668 >= 14764
size=       8kB time=00:00:00.97 bitrate=  65.8kbits/s speed= 103x    
video:0kB audio:8kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.048112%

I am using an Apple M1 machine running MacOS 13.5.2 (22G91).

Is the CLI using a different mechanism than av_parser_parse2 to perform this conversion, and is there a better way to accomplish this via the C API?

0

There are 0 best solutions below