如何使用ffmpeg解码AAC网络音频流
How to decode AAC network audio stream using ffmpeg
我使用 ffmpeg 实现了一个网络视频播放器(如 VLC)。但它无法解码从 IP 摄像机接收到的 AAC 音频流。它可以解码其他音频 sterams,如 G711、G726 等。我将编解码器 ID 设置为 AV_CODEC_ID_AAC,并设置 AvCodecContext 的通道和采样率。但是 avcodec_decode_audio4 失败,错误代码为 INVALID_DATA。我检查了之前提出的问题,我尝试使用“config=1408”的媒体格式特定参数向 AvCodecContext 添加额外字节。我将 extradatabytes 设置为 2 个字节的“20”和“8”,但它也不起作用。感谢您的帮助,谢谢。
IP CAMERA SDP:
a=rtpmap:96 mpeg4-generic/16000/1
a=fmtp:96 streamtype=5; profile-level-id=5; mode=AAC-hbr; config=1408; SizeLength=13; IndexLength=3; IndexDeltaLength=3
AVCodec* decoder = avcodec_find_decoder((::AVCodecID)id);//set as AV_CODEC_ID_AAC
AVCodecContext* decoderContext = avcodec_alloc_context3(decoder);
char* test = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("1408").ToPointer();
unsigned int length;
uint8_t* extradata = parseGeneralConfigStr(test, length);//it is set as 0x14 and 0x08
decoderContext->channels = number_of_channels; //set as 1
decoderContext->sample_rate = sample_rate; //set as 16000
decoderContext->channel_layout = AV_CH_LAYOUT_MONO;
decoderContext->codec_type = AVMEDIA_TYPE_AUDIO;
decoderContext->extradata = (uint8_t*)av_malloc(AV_INPUT_BUFFER_PADDING_SIZE + length);
memcpy(decoderContext->extradata, extradata, length);
memset(decoderContext->extradata+ length, 0, AV_INPUT_BUFFER_PADDING_SIZE);
您是否检查了 INVALID_DATA 的数据?
可以根据RFC
查看
RFC3640 (3.2 RTP Payload Structure)
AAC Payload 可以像下面这样分开
AU-Header | Size Info | ADTS | Data
示例负载 00 10 0c 00 ff f1 60 40 30 01 7c 01 30 35 ac
根据你分享的配置
AU-size (SizeLength=13)
AU-Index / AU-Index-delta (IndexLength=3/IndexDeltaLength=3)
AU-Header 的位长度为 13(SizeLength) + 3(IndexLength/IndexDeltaLength) = 16
。
AU-Header00 10
您应该为尺码信息使用 AU-size(SizeLength) 值
AU-size: Indicates the size in octets of the associated Access Unit in the Access Unit Data Section in the same RTP packet.
前 13 (SizeLength) 位 0000000000010
等于 2。因此读取 2 个八位字节以获取大小信息。
尺寸信息 0c 00
ADTS ff f1 60 40 30 01 7c
ADTS Parser
ID MPEG-4
MPEG 层 0
CRC 校验和缺失 1
配置文件低复杂性配置文件 (AAC LC)
采样频率 16000
私有位 0
通道配置 1
Original/copy 0
主页 0
版权标识位 0
版权标识开始0
AAC 帧长 384
ADTS 缓冲区满度 95
第 0 帧中没有原始数据块
数据以 01 30 35 ac
开头。
我使用 ffmpeg 实现了一个网络视频播放器(如 VLC)。但它无法解码从 IP 摄像机接收到的 AAC 音频流。它可以解码其他音频 sterams,如 G711、G726 等。我将编解码器 ID 设置为 AV_CODEC_ID_AAC,并设置 AvCodecContext 的通道和采样率。但是 avcodec_decode_audio4 失败,错误代码为 INVALID_DATA。我检查了之前提出的问题,我尝试使用“config=1408”的媒体格式特定参数向 AvCodecContext 添加额外字节。我将 extradatabytes 设置为 2 个字节的“20”和“8”,但它也不起作用。感谢您的帮助,谢谢。
IP CAMERA SDP:
a=rtpmap:96 mpeg4-generic/16000/1
a=fmtp:96 streamtype=5; profile-level-id=5; mode=AAC-hbr; config=1408; SizeLength=13; IndexLength=3; IndexDeltaLength=3
AVCodec* decoder = avcodec_find_decoder((::AVCodecID)id);//set as AV_CODEC_ID_AAC
AVCodecContext* decoderContext = avcodec_alloc_context3(decoder);
char* test = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("1408").ToPointer();
unsigned int length;
uint8_t* extradata = parseGeneralConfigStr(test, length);//it is set as 0x14 and 0x08
decoderContext->channels = number_of_channels; //set as 1
decoderContext->sample_rate = sample_rate; //set as 16000
decoderContext->channel_layout = AV_CH_LAYOUT_MONO;
decoderContext->codec_type = AVMEDIA_TYPE_AUDIO;
decoderContext->extradata = (uint8_t*)av_malloc(AV_INPUT_BUFFER_PADDING_SIZE + length);
memcpy(decoderContext->extradata, extradata, length);
memset(decoderContext->extradata+ length, 0, AV_INPUT_BUFFER_PADDING_SIZE);
您是否检查了 INVALID_DATA 的数据?
可以根据RFC
RFC3640 (3.2 RTP Payload Structure)
AAC Payload 可以像下面这样分开
AU-Header | Size Info | ADTS | Data
示例负载 00 10 0c 00 ff f1 60 40 30 01 7c 01 30 35 ac
根据你分享的配置
AU-size (SizeLength=13)
AU-Index / AU-Index-delta (IndexLength=3/IndexDeltaLength=3)
AU-Header 的位长度为 13(SizeLength) + 3(IndexLength/IndexDeltaLength) = 16
。
AU-Header00 10
您应该为尺码信息使用 AU-size(SizeLength) 值
AU-size: Indicates the size in octets of the associated Access Unit in the Access Unit Data Section in the same RTP packet.
前 13 (SizeLength) 位 0000000000010
等于 2。因此读取 2 个八位字节以获取大小信息。
尺寸信息 0c 00
ADTS ff f1 60 40 30 01 7c
ADTS Parser
ID MPEG-4
MPEG 层 0
CRC 校验和缺失 1
配置文件低复杂性配置文件 (AAC LC)
采样频率 16000
私有位 0
通道配置 1
Original/copy 0
主页 0
版权标识位 0
版权标识开始0
AAC 帧长 384
ADTS 缓冲区满度 95
第 0 帧中没有原始数据块
数据以 01 30 35 ac
开头。