| 项目搜索 |
| |
|
代码片段库:
查看代码片段
浏览
| 提交新的代码片段
| 创建代码包
RealSystem SDK 音视频同步
|
类型:
Sample Code (HOWTO) |
类别:
Other
|
许可证:
GNU General Public License |
语言:
C++
|
描述:
RealSystem SDK 中关于播放过程中音视频同步,只给出一个很简单的例子,开发者很难通过这个例子理解Real播放音视频同步控制。在工作中需要做RMVB文件的实时转换,实现了Real播放音视频同步。现在公开同步代码,作为RealSystem SDK示例的补充。(zhaott,[email protected])
|
该代码片段的版本系列:
片段ID |
下载版本 |
提交时间 |
提交人 |
删除 |
4869 | 1.0 | 2007-05-19 13:56 | zhaott | |
点击"下载版本"来下载该代码片段.
最新版本的代码片段: 1.0
Real播放音视频同步代码 zhaott([email protected])
一,打开音频设备,初始化系统时间参数,计算同步回叫时间。
STDMETHODIMP CMCSDKRealAudioService::Open(const RMAAudioFormat* pAudioFormat,IRMAAudioDeviceResponse* pStreamResponse)
{
TRACE_INFO2("SDK Real file audio open");
if(m_pResponse)
{
return E_POINTER;
}
m_pResponse = pStreamResponse;
m_pResponse->AddRef();
//初始化系统时间参数
m_nTime = 0;
m_nAudioTime = 0;
m_nAudioDataTime = 0;
//计算同步回叫时间
m_nCallbackTime = ((pAudioFormat->uMaxBlockSize*1000*8)/(pAudioFormat->uChannels*pAudioFormat->ulSamplesPerSec*pAudioFormat->uBitsPerSample));
m_nEventTime = 9;
TRACE_INFO2("SDK Real file m_nCallbackTime = "<<m_nCallbackTime);
return S_OK;
}
二,关闭音频设备,取消回叫。
STDMETHODIMP CMCSDKRealAudioService::Close(const BOOL bFlush )
{
//取消回叫
RemoveCallback();
if(bFlush)
{
DrainData();
}
SAFE_RELEASE(m_pResponse);
m_nTime = 0;
m_nAudioTime = 0;
m_nAudioDataTime = 0;
m_nTimeCountStart = 0;
m_nTimeFrequency = 0;
m_nPerformanceCounterStart = 0;
m_nCallbackTime = 0;
m_nEventTime = 0;
TRACE_INFO2("SDK Real file audio close");
return S_OK;
}
三,Resume启动回叫,Pause取消回叫。
STDMETHODIMP CMCSDKRealAudioService::Resume()
{
TRACE_INFO2("SDK Real file audio resume");
AddCallback(m_nEventTime);
return S_OK;
}
STDMETHODIMP CMCSDKRealAudioService::Pause()
{
TRACE_INFO2("SDK Real file audio pause");
RemoveCallback();
return S_OK;
}
四,读取音频数据,写入缓冲,启动回叫。
STDMETHODIMP CMCSDKRealAudioService::Write(RMAAudioData* pAudioData)
{
if(pAudioData != NULL)
{
//时间戳是递增的
if(pAudioData->ulAudioTime > m_nAudioDataTime)
{
pAudioData->pData->AddRef();
PushData(pAudioData);
m_nAudioDataTime = pAudioData->ulAudioTime;
}
}else{
TRACE_INFO2("SDK Real file audio skip time = "<<m_nAudioDataTime);
TRACE_INFO2("SDK Real file audio skip skip time = "<<pAudioData->ulAudioTime);
}
AddCallback(m_nEventTime);
return S_OK;
}
五,给音频设备返回系统时间。
STDMETHODIMP CMCSDKRealAudioService::GetCurrentAudioTime(REALCORE_REF(ULONG32) ulCurrentTime)
{
ulCurrentTime = m_nTime;
#ifdef DEBUG_TIME
TRACE_INFO2("SDK Real file audio TIME = "<<ulCurrentTime);
#endif //DEBUG_TIME
return S_OK;
}
六,回叫函数,音视频同步。
首先计算系统时间,然后取得音频时间戳,同步视频。
最后计算回叫时间,控制音频输出速度
STDMETHODIMP CMCSDKRealAudioService::Func()
{
RMAAudioData AudioData;
//计算系统时间 {
if(m_nTimeCountStart != 0)
{
//time
m_nTime = (::GetTickCount()-m_nTimeCountStart);
}else{
m_nTimeCountStart = ::GetTickCount();
//time
m_nTime = 0;
}
}
//处理缓冲音频数据
if(PopData(AudioData))
{
if(AudioData.ulAudioTime > m_nAudioTime)
{
}else{
TRACE_INFO2("SDK Real file audio sync skip");
}
//同步视频
if(m_pResponse != NULL)
{
m_pResponse->OnTimeSync(m_nAudioTime);
}
//最后计算回叫时间,控制音频输出速度
m_nAudioTime = AudioData.ulAudioTime;
if((AudioData.ulAudioTime + (m_nCallbackTime)) < m_nTime)
{
//TRACE_INFO2("SDK Real file audio slow time = "<<(m_nTime-AudioData.ulAudioTime));
m_nEventTime = (m_nCallbackTime*2/3);
}else if(AudioData.ulAudioTime > (m_nTime + (m_nCallbackTime)))
{
//TRACE_INFO2("SDK Real file audio fast time = "<<(AudioData.ulAudioTime-m_nTime));
m_nEventTime = (m_nCallbackTime*2);
}else{
m_nEventTime = m_nCallbackTime;
}
AddCallback(m_nEventTime);
AudioData.pData->Release();
#ifdef DEBUG_TIME
TRACE_INFO2("SDK Real file audio time = "<<AudioData.ulAudioTime);
#endif //DEBUG_TIME
}else{
m_nEventTime = 9;
TRACE_INFO2("SDK Real file audio no data");
}
return S_OK;
}
如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来. |
|