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?