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

FillBuffer的点疑问?请问达人

2012-03-09 
FillBuffer的点疑问?请教达人自己写个push模式的sourcefilter的重载了这个函数将内存中的数据写进sample。

FillBuffer的点疑问?请教达人
自己写个push   模式的source   filter   的重载了这个函数     将内存中的数据写进sample   。我看sdk的例子都是在filter的构造函数中就获取到了视频数据(那些bmp文件)。   可是我的程序是使用rtp接收到的。   怎么才能传进这个filter中阿?




[解决办法]
我觉得不用另起线程,因为只有每接收完一祯之后,才进行fillbuffer,所以这是串联的操作。
[解决办法]
不管哪种方式,都是rtp收到包后先缓存下来,然后再在FillBuffer给调用时往其参数里面塞上缓存的第一帧数据.可参考以下代码:

HRESULT CMultiMediaStream::FillBuffer(IMediaSample *pms)
{
CAutoLock autolock(&m_BufferLock);
CheckPointer(pms, S_OK);
VOP::MediaSample* pMediaSample = NULL;
//如果得不到MediaSample,则出错处理

if (!OutputMediaSample(&pMediaSample)) //从缓冲区中取出一帧数据
return E_POINTER;

pms-> SetActualDataLength(pMediaSample-> actualdatalengh);
int actualdatalengh = pMediaSample-> actualdatalengh;
BYTE *pPointer;
try
{
pms-> GetPointer(&pPointer);
memset(pPointer, 0, actualdatalengh);
memcpy(pPointer, pMediaSample-> pBuffer, actualdatalengh);

}
catch (...)
{

if (pMediaSample-> actualdatalengh > m_PerProperties.cbBuffer)
{
m_PerProperties.cbBuffer = pMediaSample-> actualdatalengh + 1000;
DecideAllocator(m_pInputPin, &m_pAllocator);
m_pAllocator-> Commit();
}
PutPopMediaSample(pMediaSample);
return E_POINTER;
}

if (pMediaSample-> MediaTimeStart != -1 && pMediaSample-> MediaTimeEnd != -1)
{
pms-> SetMediaTime(&pMediaSample-> MediaTimeStart, &pMediaSample-> MediaTimeEnd);
}
else
{
pms-> SetMediaTime(NULL, NULL);
}

if (pMediaSample-> TimeStart != -1 && pMediaSample-> TimeEnd != -1)
{
if (false == m_pSourceFilter-> m_bDeltaSetted)
{
m_pSourceFilter-> SetStreamTimeDelta(pMediaSample-> TimeStart + m_pSourceFilter-> GetStreamTimeDelta());
m_pSourceFilter-> m_bDeltaSetted = true;
}
m_pSourceFilter-> RemoveTimeDelta(*pMediaSample);
pms-> SetTime(&pMediaSample-> TimeStart, &pMediaSample-> TimeEnd);
}
else
{
pms-> SetTime(NULL, NULL);
}
//SourceSeeking,设置播放时间
m_pSourceFilter-> StreamTime(m_rtStart);
//ATLTRACE( "\nm_rtStart = %I64d ", m_rtStart);
//设置同步点
pms-> SetDiscontinuity((pMediaSample-> IsDiscontinuity == 1) ? TRUE : FALSE);
pms-> SetPreroll((pMediaSample-> IsPreroll == 1)? TRUE : FALSE);
pms-> SetSyncPoint((pMediaSample-> IsSyncPoint == 1) ? TRUE : FALSE);
//回收数据
ReclaimMediaSample(pMediaSample);
return S_OK;
}

热点排行