主题:P2P流媒体
[em2] 各位大哥大姐,能帮帮我吗?具体是这样子的:
以下是WMFSDK95\samples\wmvcopy\wmvcopy.cpp的部分代码,OnTime和OnStreamSample是两个回调函数;我的问题是有没有办法将调用OnStreamSample时的参数实时写入内存,即相同的数据写入到内存的速度和播放这段数据所需要的时间相等,时间要精确,以下是我实现的代码,目的是将播放1秒的数据写入到内存的总时间是1秒,不知道对不对?有没有更好的方法?
{wmvcopy本来是读取一个WMV文件,经过处理后写入到另一个文件,我把她修改了一下,让她实时写入到一个指定的内存中}
struct DATA{
WORD wStreamNum;
QWORD SampleTime;
DWORD dwFlags;
DWORD pdwLength;
};定义数据头
BYTE *BUFF = new BYTE[10000000]; //指定的内存
DWORD BuffSeek = 0; //内存写偏移
DWORD systemtime = 0; //储存上一次调用OnTime的时间
//----------------------------------------------------------------------------
HRESULT CWMVCopy::OnTime( /* [in] */ QWORD qwCurrentTime,
/* [in] */ void __RPC_FAR * pvContext)
{
if( !m_fEOF )
{
m_qwReaderTime += 10000000;
HRESULT hr = m_pReaderAdvanced->DeliverTime( m_qwReaderTime );
if( FAILED( hr ) )
{
m_hr = hr;
SetEvent( m_hEvent );
}
}
if(systemtime!= 0)
{
while(1)
{
Sleep(1);
if(1000 <= timeGetTime() - systemtime)break;
}
systemtime = timeGetTime();
}
else
{
systemtime = timeGetTime();
}
return( S_OK );
}
//-------------------------------------------------------------------------
HRESULT CWMVCopy::OnStreamSample( /* [in] */ WORD wStreamNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR * pSample,
/* [in] */ void __RPC_FAR * pvContext)
{
HRESULT hr = S_OK;
BYTE *ppdwBuffer = NULL;
DWORD pdwLength = 0;
pSample->GetBufferAndLength(&ppdwBuffer,&pdwLength);
DATA *data = new DATA;
data->dwFlags = dwFlags;
data->pdwLength = pdwLength;
data->SampleTime = cnsSampleTime;
data->wStreamNum = wStreamNum;
memcpy(BUFF+BuffSeek,data,sizeof(DATA));//写入数据头
BuffSeek+=sizeof(DATA);
memcpy(BUFF+BuffSeek,ppdwBuffer,pdwLength); //写入数据
BuffSeek+=pdwLength;
delete data;
if( FAILED( hr ) )
{
m_hr = hr;
SetEvent( m_hEvent );
}
return( S_OK );
}
以下是WMFSDK95\samples\wmvcopy\wmvcopy.cpp的部分代码,OnTime和OnStreamSample是两个回调函数;我的问题是有没有办法将调用OnStreamSample时的参数实时写入内存,即相同的数据写入到内存的速度和播放这段数据所需要的时间相等,时间要精确,以下是我实现的代码,目的是将播放1秒的数据写入到内存的总时间是1秒,不知道对不对?有没有更好的方法?
{wmvcopy本来是读取一个WMV文件,经过处理后写入到另一个文件,我把她修改了一下,让她实时写入到一个指定的内存中}
struct DATA{
WORD wStreamNum;
QWORD SampleTime;
DWORD dwFlags;
DWORD pdwLength;
};定义数据头
BYTE *BUFF = new BYTE[10000000]; //指定的内存
DWORD BuffSeek = 0; //内存写偏移
DWORD systemtime = 0; //储存上一次调用OnTime的时间
//----------------------------------------------------------------------------
HRESULT CWMVCopy::OnTime( /* [in] */ QWORD qwCurrentTime,
/* [in] */ void __RPC_FAR * pvContext)
{
if( !m_fEOF )
{
m_qwReaderTime += 10000000;
HRESULT hr = m_pReaderAdvanced->DeliverTime( m_qwReaderTime );
if( FAILED( hr ) )
{
m_hr = hr;
SetEvent( m_hEvent );
}
}
if(systemtime!= 0)
{
while(1)
{
Sleep(1);
if(1000 <= timeGetTime() - systemtime)break;
}
systemtime = timeGetTime();
}
else
{
systemtime = timeGetTime();
}
return( S_OK );
}
//-------------------------------------------------------------------------
HRESULT CWMVCopy::OnStreamSample( /* [in] */ WORD wStreamNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR * pSample,
/* [in] */ void __RPC_FAR * pvContext)
{
HRESULT hr = S_OK;
BYTE *ppdwBuffer = NULL;
DWORD pdwLength = 0;
pSample->GetBufferAndLength(&ppdwBuffer,&pdwLength);
DATA *data = new DATA;
data->dwFlags = dwFlags;
data->pdwLength = pdwLength;
data->SampleTime = cnsSampleTime;
data->wStreamNum = wStreamNum;
memcpy(BUFF+BuffSeek,data,sizeof(DATA));//写入数据头
BuffSeek+=sizeof(DATA);
memcpy(BUFF+BuffSeek,ppdwBuffer,pdwLength); //写入数据
BuffSeek+=pdwLength;
delete data;
if( FAILED( hr ) )
{
m_hr = hr;
SetEvent( m_hEvent );
}
return( S_OK );
}