我遇到了一个定制的ffmpeg问题。基本上,它启用了一个带有x264和fdk-aac库的vanilla ffmpeg。我通过ffmpeg API提供SDP文件,并在将信息传递给avcodec_open2
时收到以下错误:
不支持音频对象类型
我的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获取的输出,因为我打开输入,转储其格式,并尝试打开输入流:
格式sdp探测,大小= 2048,得分= 50 音频编解码器设置为:aac
音频采样率设置为:32000
音频通道设置为:1
视频编解码器设置为:h264
RTP打包模式:1
RTP Profile IDC:42 Profile IOP:80 Level:28
Extradata设置为0xc8d3dc0(大小:21)!
avformat_find_stream_info()之前的文件位置是522
不支持音频对象类型3 找不到流1的编解码器参数(视频:h264):未指定大小
考虑增加'analyzeuration'和'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):未指定的大小 考虑增加'analyzeuration'和'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输入?
答案 0 :(得分:1)
首先,对象类型3是AAC-SSR(在ISO 14496-3中定义),据我所知,ffmpeg解码器不支持它。至于h.264错误,“未指定大小”消息指的是解码器无法配置视频分辨率。分辨率在AVC基本流中的SPS / PPS NALU中指定。
FFmpeg(特别是libavcodec)将分析流几秒钟,以确定配置解码器所需的参数。您的流长度为0秒,因此解码器从未正确配置。因此错误。