FFmpeg解码H264为RGB24显示

random_2011 2014-08-28 05:24:50
大家好,我最近在做基于FFMPEG的Directshow,是基于Ball例子改写的。
在FillBuffer中,使用FFMPEG获取到一帧数据,即一个AVFrame,再将其转换为RGB24格式,然后直接送入到到Sample的数据指针,现在使显示花屏,大概有4幅重复画面在一个图像里。不知道哪里出问题了,请各位高手帮忙!代码如下


HRESULT CBallStream::FillBuffer(IMediaSample *pms)
{
CheckPointer(pms,E_POINTER);
ASSERT(m_Ball);
BYTE *pData;
long lDataLen;
pms->GetPointer(&pData); //得到Sample的数据指针,即获取输出数据指针
lDataLen = pms->GetSize(); //得到数据长度
ZeroMemory(pData, lDataLen);
{
CAutoLock cAutoLockShared(&m_cSharedState);
if (ffmpeg_ReadOneFrame())
{
//反转图像 ,否则生成的图像是上下调到的
/* pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);
pFrame->linesize[0] *= -1;
pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[1] *= -1;
pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[2] *= -1;*/
//转换图像格式,将解压出来的YUV420P的图像转换为BRG24的图像
sws_scale(pSwsCtx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
//SaveAsBMP(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i++, 24);
CopyMemory(pData, pFrameRGB->data[0], pCodecCtx->width*pCodecCtx->height*3);
}

// If we haven't just cleared the buffer delete the old
// ball and move the ball on
/* m_Ball->MoveBall(m_rtSampleTime - (LONG) m_iRepeatTime);
m_Ball->PlotBall(pData, m_BallPixel, m_iPixelSize);*/
// The current time is the sample's start
CRefTime rtStart = m_rtSampleTime;
// Increment to find the finish time
m_rtSampleTime += (LONG)m_iRepeatTime;
pms->SetTime((REFERENCE_TIME *) &rtStart,(REFERENCE_TIME *) &m_rtSampleTime);
}

pms->SetSyncPoint(TRUE);
return NOERROR;

} // FillBuffer

...全文
2200 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuaishuai250 2017-03-05
  • 打赏
  • 举报
回复
楼主可以分享一下代码吗?
SunAdiya 2014-10-09
  • 打赏
  • 举报
回复
我这边解码出来会出现图像偏黄,而且会有部分图像会和其他部分区域的一样了。
random_2011 2014-09-01
  • 打赏
  • 举报
回复
引用 4 楼 sxcong 的回复:
转换为RGB24之后,先保存成BMP文件看看对不对,如果对的话,再调试dshow .如果文件都不对,说明解码部分和转换部分有问题。
其实简单的播放,用GDI也可以了。GDI播放没问题,再用dshow。分步解决问题。全混在一起,你现在都无法区分是解码还是播放的问题。


引用 5 楼 zhangyonghui2117 的回复:
ddshow的代码呢,


非常感谢各位的热心回答,我已经自己搞定了。
直接输出了RGB32,就可以解码了。也不知道对不对。新手一个。还请各位多多关照啊!!
「已注销」 2014-08-31
  • 打赏
  • 举报
回复
ddshow的代码呢,
sxcong 2014-08-30
  • 打赏
  • 举报
回复
转换为RGB24之后,先保存成BMP文件看看对不对,如果对的话,再调试dshow .如果文件都不对,说明解码部分和转换部分有问题。 其实简单的播放,用GDI也可以了。GDI播放没问题,再用dshow。分步解决问题。全混在一起,你现在都无法区分是解码还是播放的问题。
random_2011 2014-08-28
  • 打赏
  • 举报
回复
显示图片如下
「已注销」 2014-08-28
  • 打赏
  • 举报
回复
我不会ffmpeg,帮楼主顶一下

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧