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

lottyying 2009-01-13 05:14:56
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。
...全文
1908 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Freedomxiaoyu 2011-09-04
  • 打赏
  • 举报
回复
楼主
我再查这个问题!
我看到一个与你用的很像导致的马赛克!

在处理buffer互斥访问时,把buffer设为static全局变量,频繁的互斥读写静态存储区可能导致手机内存CPU负担,把buffer放在堆上分配就OK了。 在手机平台上,要尽量把内存分配在堆上。
motopzax 2011-09-01
  • 打赏
  • 举报
回复
丢包了
wyymaomi 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lius1984 的回复:]
引用楼主 lottyying 的帖子:
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。


解码流数……
[/Quote]

我的估计也是这样,没有到I帧就开始解码了
那么怎么判断I帧呢?
99263 2010-01-29
  • 打赏
  • 举报
回复
我记得以前在中华视频网的论坛(http://bbs.chinavideo.org)有人解答过这个问题,不过现在找不到连接了!
lian050216 2010-01-24
  • 打赏
  • 举报
回复
你好,你这个问题解决了没
SmallBigCat 2009-08-31
  • 打赏
  • 举报
回复
提供H264视频流+RTSP/RTP传输+WMP播放+WEB播放解决方案;QQ:7692706
GoogleGeek 2009-02-12
  • 打赏
  • 举报
回复
建议到下面的专业的 FFmpeg讨论组 来咨询!

http://groups.google.com/group/nextplayer
warsour 2009-02-04
  • 打赏
  • 举报
回复
bitrate值设置高点,比如720*1000
netsocket 2009-02-02
  • 打赏
  • 举报
回复
帮顶
lius1984 2009-02-02
  • 打赏
  • 举报
回复
马赛克是模拟器还是真机上? 如果真机很可能是内存不够造成的,申请大一点的内存。 要还没解决的话 加我QQ 359950119交流
lottyying 2009-02-02
  • 打赏
  • 举报
回复
还有人知道么?这是年前一直困扰的问题,希望大家帮助一下我, 尽快解决这个问题,不想再拖啦!~
lottyying 2009-02-02
  • 打赏
  • 举报
回复
新的一年新气象!首先祝大家新年成事如意!谢谢大家的解答!
sxcong 2009-01-17
  • 打赏
  • 举报
回复
//这一句是解码,解成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之后很正常。你参考一下。
lottyying 2009-01-17
  • 打赏
  • 举报
回复
SXcong,我是要解网络的,avcodec_decode_video()我会调用,但是每次解出来不一定是完整的帧,我是要判断是否是完整的帧!
lottyying 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sxcong 的回复:]
你是用ffmpeg.exe解码,还是用libavcodec.dll?
如果用libavcodec,要仔细参考ffmpeg.c,上面解码是放到一个环形缓冲里的,循环,等这一帧完全解好,再发到Render上。你自己解码,可能解一帧就播放一帧,没注意这一帧解码是否完全解好。如果某帧解不完全,就有mosaic现象。
[/Quote]
"等这一帧完全解好"??如何判断这一帧完全解好呢?我每次调用avcodec_decode_video(pContext, (AVFrame *)pFrame, &GotFrame, (uint8_t *)pData, iDataLen) 判断Goframe都是大于0的,而且等于idatalen,这说明已经解出了一帧啊! 这样判断对不对?
lottyying 2009-01-16
  • 打赏
  • 举报
回复
我发现我往文件里每写一个BUFFER的时候不一定刚好能解出帧,所以frame缓冲不完整,丢帧了,如何解决这个问题?
我怎么判断一帧完整了再送去decode??
lottyying 2009-01-16
  • 打赏
  • 举报
回复
是用libavcodec.dll解码的, avcodec_decode_video()判断如果 got_decoded_frame 解出一帧放到我自己做的一个缓冲里(同时这里我也把它写到一个文件),
播文件的没有mosai,播缓冲里就会有mosaic现象,什么原因?
sxcong 2009-01-16
  • 打赏
  • 举报
回复
你是用ffmpeg.exe解码,还是用libavcodec.dll?
如果用libavcodec,要仔细参考ffmpeg.c,上面解码是放到一个环形缓冲里的,循环,等这一帧完全解好,再发到Render上。你自己解码,可能解一帧就播放一帧,没注意这一帧解码是否完全解好。如果某帧解不完全,就有mosaic现象。
lius1984 2009-01-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 lottyying 的帖子:]
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。
[/Quote]

解码流数据出现马赛克是因为I帧没到就解码了,可以设置当解码返回的len>一定值 才解码。
解码本地文件出现闪烁 可能因为ffmpeg没有消除消隐区。 比如avcodec_decode_video一个qcif文件,其linesize是192而不是176,还有16字节存放其他信息。 可以参照下面的代码把消隐区去掉,再用SDL显示

len = avcodec_decode_video(pContext, (AVFrame *)pFrame, &usize, (uint8_t *)pData, iDataLen);

img_convert((AVPicture *)pTmpFrame, PIX_FMT_YUV420P, (AVPicture *)pFrame, pContext->pix_fmt, pContext->width, pContext->height);

SDLDisplayVideo();

lottyying 2009-01-15
  • 打赏
  • 举报
回复
传输是用VLC做SERVER,LIVE555接收,然后传给FFMPEG解码。
丢包不可能吧,因为我把收到的包存下来了,用VLC去播很正常,问题可能出在解码这,
可是解码是用FFMPEG解的啊,出错机率不大,而且I帧显示是很正常的,就是其它帧有马塞克,
请问问题出在哪呢?显示好像也不可能啊..
加载更多回复(6)

2,543

社区成员

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

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