我基本分析清楚了一个程序利用socket和视频采集卡建立连接,并利用recvfrom(pThis->rtpSocket, pBuff, MAX_BUFFER_SIZE, 0, (sockaddr *)&remoteAddr, (int *)&nLen);接受数据,然后经过了m_pXvidDec->Decode( (unsigned char *)m_pRecvedBuffer, (unsigned char *)m_pYuy2Buffer, m_lDataPos, m_Width))函数后又调用了YUY2_RGB(m_pYuy2Buffer, m_pRGBBuffer, m_Width * m_Height * 2)以上保存从视频采集卡传过来的数据成avi文件,是保存哪部分数据呢?是pBuff,m_pRecvedBuffer,m_pYuy2Buffer还是m_pRGBBuffer来调用AVIStreamWrite(m_strmVideo, frameNo, 1, buf, sizeImage, bKeyFrame ? AVIIF_KEYFRAME : 0, NULL, NULL);呢??

解决方案 »

  1.   

    视频采集卡传过来的数据在我未调用m_pXvidDec->Decode( (unsigned char *)m_pRecvedBuffer, (unsigned char *)m_pYuy2Buffer, m_lDataPos, m_Width))解压之前应该是压缩过的吧,我在保存为avi录像时还要再调用AVIMakeCompressedStream函数来压缩一下录像数据吗?
      

  2.   

    视频卡输出的是YUY2格式的图像吗?
    你需要保存的视频是RGB格式的话就用最后一个RGB格式的了.
    你上面的代码,第1步是获取采集卡采集到的数据,然后第2步是将其解压成YUY2型的数据格式( 因为你的采集卡支持的YUY2类型的)
    第3步是将YUY2转化为RGB类型的.一般来说avi保存的数据类型都是RGB.所以我想应该是用第3种
      

  3.   

    我用m_AVIRec->WriteVideo(m_FrameIndex,m_pRecvedBuffer,m_lDataPos,TRUE); 
    m_FrameIndex++; 
    if (m_pFFMpeg->AVDecode(m_pRecvedBuffer, m_lDataPos, (BYTE **)&pBuff)) 

    m_D3DRender.UpdateData(0, pBuff); 

    来保存,如上所示代码,WriteVideo把从视频终端传过来的数据保存到avi文件中,但是几秒钟的视频,也会被保存成十几分钟,在我播放avi的时候就会形成满放效果,虽然是十几分钟,可是容量大小也就一兆多
      

  4.   

    AVI保存的一般都是未压缩数据,即RGB数据。具体可以看AVI文件的文件头。