【问题标题】:Playing AAC RTP stream using ffdshow使用 ffdshow 播放 AAC RTP 流
【发布时间】:2013-07-19 15:08:07
【问题描述】:

我正在尝试使用自定义网络源过滤器和 ffdshow 音频解码器(ffdshow-tryout stable)播放 RTP 流。 我在源输出流上设置的媒体类型是 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解码器也没有错误输出。

Axis 相机的 SDP 参数为:

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; 

有人可以帮帮我吗?

【问题讨论】:

    标签: directshow rtp aac ffdshow


    【解决方案1】:

    您收到的数据可能包含在 ADTS 标头中,您需要剥离 ADTS 标头以便为解码器提供原始 AAC。

    【讨论】:

    • 谢谢...我不确定是不是这样。我最终使用 faad 库来解码源本身内部的 AAC。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2013-01-25
    • 2012-08-11
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多