directshow音视频录制同步问题

在高清录播系统开发中,使用DirectShow采集音频和视频时遇到音视频不同步问题,主要是由于音频Filter默认的0.5s缓冲导致。通过调整音频数据缓冲至40ms,并在回调函数中设置同步信号,可以有效解决录制文件的音视频同步问题,避免播放时音频延迟和乱序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近负责高清录播系统的开发,使用的是windows media format 作为编码器,用directshow采集音频和视频。使用ISampleGrabber中的回调函数来获取采集到的音视频数据。在回调函数中,获取音频数据代码如下(注意此处采集到的每一帧音频数据是半秒数据):

STDMETHODIMP BufferCB(double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
//可能会存在不可预知的问题,此处返回的音频数据为半秒的数据。。。。
//对返回的数据长度进行判断,使用队列来管理数据帧
if(!pBuffer)return 0;
  
//处理音频数据
if(lBufferSize<m_dwAvgBytesPerSec)
{
memcpy(m_pBuf[m_nIndex]+m_bufOffset,pBuffer,lBufferSize);
m_bufOffset = m_bufOffset+lBufferSize;
if(m_bufOffset>=m_dwAvgBytesPerSec)
{
m_bufOffset = 0;
m_nIndex = (m_nIndex+1)%10;
}
    
//////////////////////////////////////////////////////////////////////////
 if(m_nIndex==1)
 {
  m_bReady = TRUE;
}

}

return 0;
}

采集视频的代码如下:


STDMETHODIMP BufferCB(double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
// nFrame++;

if (!pBuffer)return E_POINTER;
  if(m_ImageData && m_bFrame)
{
if(m_FrameLen<lBufferSize)
return 0;
  memcpy(m_ImageData,pBuffer,lBufferSize);
}
  m_bFrame = FALSE;

return 0;
}

在主程序中开启两个线程,一个线程数压缩每一帧采集到的数据,另外一个线程每一次有数据到达时,设置采集每一帧音视频数据为真。按照此方法,最后录制的视频文件会出现音视频不同步,其中音频总是比视频慢0.5s,且在播放一段时间后,音频会出现乱序的现象。针对于以上现象,出现的关键原因是在directshow中,采集音频的FIlter默认把数据缓冲设置为0.5s,这就导致了较大的延迟,最终导致了音视频不同步。解决办法是把音频采集到的数据缓冲开为40ms,在每一次运行音频捕获数据的回调函数中,设置一个进行每一帧音视频压缩的信号,这样在压缩为wmv格式的视频文件后,播放时,音频和视频都很流畅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值