0

我遇到了定制 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 输入?

4

1 回答 1

1

首先,对象类型 3 是 AAC-SSR(它在 ISO 14496-3 中定义),据我所知,ffmpeg 解码器不支持它。至于 h.264 错误,“未指定大小”消息是指解码器无法配置视频分辨率这一事实。分辨率在 AVC 基本流中的 SPS/PPS NALU 中指定。

FFmpeg(特别是 libavcodec)将分析一个流几秒钟以确定配置解码器所需的参数。您的流长度为 0 秒,因此解码器从未正确配置。因此出现错误。

于 2013-10-02T17:58:30.267 回答