专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

用FFMPEG解出来的图像显示有马塞克,咋回事

发布时间:2011-06-27 19:27:52 文章来源:www.iduyao.cn 采编人员:星星草
用FFMPEG解出来的图像显示有马塞克,怎么回事?
用FFMPEG解出来的图像显示有马塞克,怎么回事? 
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。

------解决方案--------------------
扫描线在来回抖动,是制式的问题,比如视频源是NTSC,你按PAL采集编码经常会出现这种情况。
马塞克有两种:
一种是丢失数据引起的,另一种是压缩过大,比如下载的rmvb电影经常有。
如果能确定你的文件播放过程没有丢失数据(播放一帧同时写一帧到文件,然后和原始文件比较),那就是码流设置的问题了,设置大一些试试。

------解决方案--------------------
VLC本身有丢包处理,所以就算网络堵塞,丢很多包,最多是卡,不会马塞克。
SDL只是个图像显示库,本身没有网络传输功能吧,传输这部分你怎么做的?问题应该出在这里
------解决方案--------------------
你是用ffmpeg.exe解码,还是用libavcodec.dll?
如果用libavcodec,要仔细参考ffmpeg.c,上面解码是放到一个环形缓冲里的,循环,等这一帧完全解好,再发到Render上。你自己解码,可能解一帧就播放一帧,没注意这一帧解码是否完全解好。如果某帧解不完全,就有mosaic现象。

------解决方案--------------------
引用楼主 lottyying 的帖子:
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。

------解决方案--------------------
//这一句是解码,解成YUV420
int len = avcodec_decode_video(decode_c, decode_picture, &got_picture,inbuf_ptr, size);

if(len == -1)
return;

if (got_picture) 
{
AVFrame *tmp_picture;
tmp_picture=avcodec_alloc_frame();
if(tmp_picture==NULL)
return ;
int numBytes=avpicture_get_size(PIX_FMT_RGB24, video_width, video_height);
uint8_t* buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

avpicture_fill((AVPicture *)tmp_picture, buffer, PIX_FMT_RGB24, video_width, video_height);

//YUV420转成RGB24
img_convert((AVPicture *)tmp_picture, PIX_FMT_RGB24, (AVPicture *)decode_picture, PIX_FMT_YUV420P ,decode_c->width,decode_c->height);

//回调,或直接Render (tmp_picture->data[0],numBytes


av_free(buffer);
av_free(tmp_picture);
}

上面这个例子表示在一般情况下,不用循环,一次可以解一帧,解完之后img_convert转成BMP,Render之后很正常。你参考一下。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: