首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

AAC Encode Filter 不能播发

2013-04-21 
AAC Encode Filter 不能播放最近搞一个项目,需要完成一个Transform Filter, 实现接收PCM音频数据,输出AAC

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

热点排行