Воспроизведение потока AAC RTP с помощью ffdshow
Я пытаюсь воспроизвести поток RTP с помощью специального сетевого фильтра источника и аудиодекодера ffdshow (ffdshow-tryout stable). Медиатип, который я установил в исходном потоке вывода, это MEDIASUBTYPE_RAW_AAC1. Вот что я устанавливаю:
pmt->SetType(&MEDIATYPE_Audio);
pmt->SetSubtype(&MEDIASUBTYPE_RAW_AAC1);
pmt->SetFormatType(&FORMAT_WaveFormatEx);
BYTE *AACRAW;
DWORD dwLen = sizeof(WAVEFORMATEX) + 2; //2 bytes of audio config
AACRAW = (BYTE *)::CoTaskMemAlloc(dwLen);
memset(AACRAW, 0, dwLen);
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_RAW_AAC1;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 16000;
wfx.nAvgBytesPerSec = 8000;
wfx.nBlockAlign = 1;
wfx.wBitsPerSample= 0;
wfx.cbSize = 2;
memcpy(AACRAW, (void *)&wfx, sizeof(WAVEFORMATEX));
vector<unsigned char>extra;
extra.push_back(0x14);
extra.push_back(0x08);
memcpy(AACRAW + sizeof(WAVEFORMATEX), extra.data(), extra.size());
pmt->SetFormat(AACRAW, dwLen);
::CoTaskMemFree(AACRAW);
И затем, когда я получаю пакет rtp, вот что я пересылаю в фильтр ffdshow:
DeliverRTPAAC(pRaw + 12 + 2 + 2, nBufSize - 12 - 2 - 2, pack.timestamp);
где pRaw - указатель на пакет rtp. Каждый пакет rtp, который я получаю, содержит один AU.
Фильтры подключаются, но не воспроизводят звук. Также не выводится ошибка от декодера AAC.
Параметры SDP от камеры Axis:
a=rtpmap:97 mpeg4-generic/16000/1
a=fmtp:97 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1408; sizeLength=13; indexLength=3; indexDeltaLength=3; profile=1; bitrate=64000;
Может кто-нибудь помочь мне, пожалуйста?
1 ответ
Возможно, данные, которые вы получаете, обернуты в заголовки ADTS, и вам нужно удалить заголовок ADTS, чтобы снабдить декодер необработанным AAC.