最近在做摄像机实时流采集的项目,其中用到了H264解码;
项目是通过DirectShow来实现的,其中通过SampleGrabber接口提供的BuffeCB方法来获得每一帧数据;
按常理来说BufferCB中应该是完整一帧数据,但是但是在有些电脑上出现的情况却让我意外;
使用ffmpeg解码后渲染发现只要有运动物体时就会出现花屏;
同时如果降低显示器分辨率或者缩小窗口这时花屏现象就会消失;
这个问题一直困扰着我,甚至一度认为是摄像机输出的实时流存在问题。
通过下述代码可以实现不是一帧的数据的解码:
<pre name="code" class="cpp">void decodeFrame(BYTE* buffer , int bufferLen)
{
av_init_packet(&pkt);
pkt.data = buffer;
pkt.size = bufferLen;
av_decode_video2(pCodecCtx, pFrame, &got_picture_ptr, &pkt); //获取解码后的数据
}
void decode(BYTE* buffer, int bufferLen)
{
int pos = 0;
do
{
BYTE* pOut;
int pOut_size;
int len = 0;
len = av_parser_parse2(m_parser, pCodecCtx, &pOut, &pOut_size,
buffer + pos, bufferLen + pos, pts, dts, 0); // 这是一个很关键的方法
pos += len;
if(pOut_size > 0 )
{
decodeFrame(pOut, pOut_size); //开始解码
}
}while(pos < bufferLen)
if(bufferLen <= 0)
{
decodeFrame(NULL, 0);
}
}