VLC二次开发YUV I420格式回调输出图像有花屏和卡顿现象

kbdmg 2014-09-11 06:08:13
现使用VLC进行文件解码播放,显示这一块是自己做的但是会碰到有花屏的情况,大概代码如下:
设置I420回调格式

unsigned Cx_FileDecodeApapter_VLC::fVlcDecoderFrameCB(void **opaque, char *chroma,unsigned *width, unsigned *height,unsigned *pitches,unsigned *lines)
{
Cx_FileDecodeApapter_VLC * stream = (Cx_FileDecodeApapter_VLC*)*opaque;
strcpy(chroma,"I420");

unsigned long buftotalline = 0;
unsigned long bufcurline = 0;
for(int i=0;i<chromaDesc->plane_count;i++)
{
pitches[i] = *width * chromaDesc->p[i].w.num / chromaDesc->p[i].w.den * chromaDesc->pixel_size;
lines[i] = *height * chromaDesc->p[i].h.num / chromaDesc->p[i].h.den;

buftotalline += pitches[i] * lines[i];
if(i == 0)
stream->yuvYBuf_ = new char[pitches[i] * lines[i]];
if(i == 1)
stream->yuvUBuf_ = new char[pitches[i] * lines[i]];
if(i == 2)
stream->yuvVBuf_ = new char[pitches[i] * lines[i]];
}
return buftotalline + 32;

}


锁回调

	Cx_FileDecodeApapter_VLC* stream;
stream = (Cx_FileDecodeApapter_VLC*)opaque;

EnterCriticalSection(&stream->VlcCBDataLock_);

if(NULL != stream->yuvframebuf_)
*planes = stream->yuvframebuf_;

if(NULL != stream->yuvYBuf_ && NULL != stream->yuvUBuf_ && NULL != stream->yuvVBuf_)
{
planes[0] = stream->yuvYBuf_;
planes[1] = stream->yuvUBuf_;
planes[2] = stream->yuvVBuf_;
}
return NULL;


解锁回调(在解锁回调内显示)

void Cx_FileDecodeApapter_VLC::fVlcDecoderUnLockCB(void *opaque, void *picture,void *const *planes)
{
//显示代码省略,主要是把yuvYBuf_,yuvUBuf_,yuvVBuf_f那里的数据显示出来
}


YUV显示大部分情况正常,但是放着放着就会有花屏和活动的物体出现类似于窗帘那样的样子,请大神指点一二。需要怎么要调 整参数或者说是什么地方需要注意。
...全文
2988 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
杂家老周 2015-08-23
  • 打赏
  • 举报
回复
其实我推荐你用FFMPEG,逻辑结构简洁清楚,不研究过VLC的开发包
Workholic_365 2015-08-22
  • 打赏
  • 举报
回复
你好 请问这个问题解决了吗?我最近也在做VLC嵌入页面的开发 发现使用嵌入VLC页面(页面自动安装插件)播放的rtsp数据流 比 使用VLC播放器播放rtsp流时 有卡顿现象,如果你已解决此问题 请回复下 或者请加我QQ:864179227 不甚感激
吃素的开飞机 2015-05-26
  • 打赏
  • 举报
回复
这个应该是显卡性能的原因,我也碰到过这个问题试试多线程解码。
  • 打赏
  • 举报
回复
楼主你好: 想请教下如果编码格式为I420那么pitches[i]和lines[i]该怎么计算 我看了你的计算方式如下: pitches[i] = *width * chromaDesc->p[i].w.num / chromaDesc->p[i].w.den * chromaDesc->pixel_size; lines[i] = *height * chromaDesc->p[i].h.num / chromaDesc->p[i].h.den; 我用的计算方式为: pitches[i] = width * 1.5; lines[i] = height; 之后在显示回调中把I420转换成RGB24贴图显示,显示的图片不正确,请问该如何设置呢?
精分患者 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 sxcong 的回复:
VLC软件本身播放视频也可能会有花屏。一般是帧不完整的原因。 一般播放器都是先用ffmpeg解码,然后自己做播放,比如用dshow, sdl,哪怕直接用gdi也行。 关于帧不完整的播放,假设你帧不连续,就等下一个 I 帧来的时候再播放,在此之前的其他帧全扔掉就行了。这时看起来效果会卡,但不花。
还要考虑到视频分辨率的关系,如果分辨率过大,解码耗费的时间过多也会出现花屏的!(最近就被我的破电脑弄疯了!)
露蛇 2014-09-22
  • 打赏
  • 举报
回复
楼上的处理方式是对的。
sxcong 2014-09-17
  • 打赏
  • 举报
回复
VLC软件本身播放视频也可能会有花屏。一般是帧不完整的原因。 一般播放器都是先用ffmpeg解码,然后自己做播放,比如用dshow, sdl,哪怕直接用gdi也行。 关于帧不完整的播放,假设你帧不连续,就等下一个 I 帧来的时候再播放,在此之前的其他帧全扔掉就行了。这时看起来效果会卡,但不花。

2,542

社区成员

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

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