AAC Encode Filter 不能播放
最近搞一个项目,需要完成一个Transform Filter, 实现接收PCM音频数据,输出AAC帧。
我把收到的AAC数据保存到文件可以用VLC播放,但是Deliver 到解码模块,没有声音,另外看到Filter的属性中有个 ExtraData ,不知道是干什么用的。代码如下:
FILE * g_pFile = fopen("F:\\aac.aac", "wb");
int g_index = 0;
void CAacEncodeFilter::SampleCallback(LPVOID lpContext, byte *pData, int nLen, UINT64 nDTS)
{
CAacEncodeFilter* pThis = (CAacEncodeFilter*)(lpContext);
IMediaSample *pMediaSample = NULL;
REFERENCE_TIME timeStart, timeEnd;
HRESULT hr = pThis->m_pOutput->GetDeliveryBuffer(&pMediaSample, NULL, NULL, 0);
ASSERT(SUCCEEDED(hr));
BYTE* pSampleBuf = NULL;
hr = pMediaSample->GetPointer(&pSampleBuf);
ASSERT(SUCCEEDED(hr));
int nDataLength = pMediaSample->GetActualDataLength();
memcpy(pSampleBuf, pData, nLen);
timeStart = g_index++ * pThis->m_nFrameTime;
timeEnd = timeStart + pThis->m_nFrameTime;
hr = ((CMediaSample*)pMediaSample)->SetTime(&timeStart, &timeEnd);
ASSERT((SUCCEEDED(hr)));
((CMediaSample*)pMediaSample)->SetMediaTime(NULL, NULL);
((CMediaSample*)pMediaSample)->SetActualDataLength(pThis->m_nFrameBufSize * 2);
((CMediaSample*)pMediaSample)->SetPreroll(FALSE);
((CMediaSample*)pMediaSample)->SetDiscontinuity(false);
//m_fDiscontinuity = false;
((CMediaSample*)pMediaSample)->SetSyncPoint(TRUE);
pThis->m_pOutput->Deliver(pMediaSample);
((CMediaSample*)pMediaSample)->Release();
fwrite(pData, nLen, 1, g_pFile);
} filter AAC
[解决办法]
估计解码模块有什么特别要求吧。
WAVEFORMATEX里不是有个cbSize吗?当cbSize不等于0时,结构体后面需要额外的补些信息...
[解决办法]
aac 的decoder需要有两个字节的附加信息,里面是采样率声道信息,需要填写,还有就是不同的AAC decoder接收的数据也不一样,有的是需要包含ADTS头,有的是需要去掉ADTS头纯粹的raw data