ENGLISH 意见建议 网站地图 网站帮助
广泛智力汇聚   高效成果传播   先进机制培育
联盟首页  |  协同开发  |  开放源码库  |  安全告警  |  开源导航  |  文档中心  |  服务支持  |  共创论坛  |  关于联盟


注册会员 网站帮助
    您的位置 »
    今天是: 2010年11月22日    
项目搜索

完全匹配   
开源软件
软件分类表
新发布软件
其它网站镜像
代码片断
协同开发
文档
论坛
寻求协助
热点项目
站点状态
编译工厂

联系我们
关于联盟

代码片段库:
查看代码片段

浏览 | 提交新的代码片段 | 创建代码包

RealSystem SDK 音视频同步

类型:
Sample Code (HOWTO)
类别:
Other
许可证:
GNU General Public License
语言:
C++
 
描述:
RealSystem SDK 中关于播放过程中音视频同步,只给出一个很简单的例子,开发者很难通过这个例子理解Real播放音视频同步控制。在工作中需要做RMVB文件的实时转换,实现了Real播放音视频同步。现在公开同步代码,作为RealSystem SDK示例的补充。(zhaott,[email protected]

该代码片段的版本系列:

片段ID 下载版本 提交时间 提交人 删除
48691.02007-05-19 13:56zhaott

点击"下载版本"来下载该代码片段.


最新版本的代码片段: 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;
}

		

提交新版本

如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来.


联盟团体会员
合作伙伴
© 共创软件联盟 版权所有
联盟服务条款 | 联盟隐私权规则 | 联系我们
电话: (8610)68313388-5949 | 传真: (8610)88377936
京ICP备05056057号