我遇到了定制 ffmpeg 的问题。基本上,它是一个启用了 x264 和 fdk-aac 库的普通 ffmpeg。我正在通过 ffmpeg API 提供一个 SDP 文件,并在将信息传递给时出现以下错误avcodec_open2
:
不支持音频对象类型 3
我的 SDP 文件:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=Unnamed
i=N/A
c=IN IP4 192.168.1.1
t=0 0
a=recvonly
m=audio 8204 RTP/AVP 96
a=rtpmap:96 mpeg4-generic/32000
a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1a88; SizeLength=13; IndexLength=3; IndexDeltaLength=3;
a=control:trackID=0
m=video 8202 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=428028;sprop-parameter-sets=Z0KAKJWgKA9E,aM48gA==;
a=control:trackID=1
m=application 8206 RTP/AVP 96
a=rtpmap:96 smpte336m/10
a=control:trackID=2
以下是我在打开输入、转储其格式并尝试打开输入流时从 ffmpeg 获得的输出:
使用 size=2048 和 score=50 探测的格式 sdp
音频编解码器设置为:aac
音频采样率设置为:32000
音频通道设置为:1
视频编解码器设置为:h264
RTP 打包模式:1
RTP 配置文件 IDC:42 配置文件 IOP:80 级别:28
Extradata 设置为 0xc8d3dc0(大小:21)!
avformat_find_stream_info() 之前的文件位置为 522
不支持音频对象类型 3。
找不到流 1 的编解码器参数(视频:h264):未指定大小
考虑增加“analyzeduration”和“probesize”选项的值
avformat_find_stream_info() 后的文件位置为 522
转储输入 AV 格式
输入 #0,sdp,来自“ conf/test.sdp':元数据:
标题:未命名
评论:N/A持续时间:N/A,比特率:N/A
Stream #0:0, 0, 1/32000: Audio: aac, 32000 Hz, 1 channels, fltp Stream #0:1, 0, 1/90000: Video: h264, 90k tbr, 90k tbn, 180k tbc Stream #0:2, 0, 1/90000: Data: none, 0/1
不支持音频对象类型 3。
我还看到因找不到流 1 的编解码器参数而报告的错误:
找不到流 1 的编解码器参数(视频:h264):未指定大小考虑增加“analyzeduration”和“probesize”选项的值
但是,我认为这是因为我在测试时没有运行实际的 rtp。
无论如何,获取音频对象类型 3 不支持异常的原因可能是什么?
更新 - 2013 年 10 月 2 日
静态 ffmpeg 构建提供以下标志:
静态 ffmpeg 2.0.1 构建标志输出:
ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Sep 30 2013 22:24:00 with gcc 4.1.2 (GCC) 20080704 (Red Hat 4.1.2-54)
configuration: --enable-gpl --enable-nonfree --enable-shared
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --enable-runtime-cpudetect --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-avfilter --enable-pthreads --enable-x11grab --enable-vdpau --disable-avisynth --enable-libdc1394 --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libx264 --enable-libxavs --enable-libxvid --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --disable-stripping
我的构建来自具有以下标志的 ffmpeg 2.0.1 快照:
--enable-static --disable-shared --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libfaac --enable-libmp3lame --enable-libx264 --disable-symver --disable-doc --disable-ffplay --enable-ffmpeg --disable-ffprobe --disable-ffserver --disable-avdevice --disable-avfilter --disable-filters --disable-devices --disable-everything --enable-avformat --enable-avcodec --enable-muxers --enable-protocols --enable-parsers --enable-demuxers --enable-decoders --enable-encoders --enable-bsfs --enable-network --enable-swscale --disable-demuxer=sbg --disable-demuxer=dts --disable-parser=dca --disable-decoder=dca --enable-asm --enable-pthreads --enable-version3
我正在使用的 fdk-aac 库版本:
fdk-aac - 0.1.2
因此,似乎同一个 .sdp 文件在我的构建中导致音频对象类型 3错误,但在静态时没有,但我真的看不出是什么原因导致它(当然我不是 ffmpeg API 的专家,可能只是错过了重要的细节)。
用于打开 .sdp 文件的简化代码,不包括错误检查和逻辑分离:
AVFormatContext *inputContext = NULL;
av_register_all();
avformat_network_init();
avformat_open_input(&inputContext, "test.sdp", NULL, NULL);
avformat_find_stream_info(inputContext, NULL);
int inAudioStreamIdx = av_find_best_stream(inputContext, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
AVStream *st = inputContext->streams[inAudioStreamIdx];
AVCodecContext *dec_ctx = st->codec;
AVCodec *dec = avcodec_find_decoder(dec_ctx->codec_id);
avcodec_open2(dec_ctx, dec, NULL); // Fails here with Audio object type 3
我是否不正确地打开了 sdp 输入?