社区
多媒体/流媒体开发
帖子详情
用FFMPEG解出来的图像显示有马塞克,怎么回事?
lottyying
2009-01-13 05:14:56
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。
...全文
1908
27
打赏
收藏
用FFMPEG解出来的图像显示有马塞克,怎么回事?
用FFMPEG解出来的图像显示有马塞克,怎么回事? 我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。 这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊? 是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
基于python实现
图像
和视频中的马赛克的删除_或向其中添加马赛克
删除
图像
和视频中的马赛克,或向其中添加马赛克 Linux, Mac OS, Windows Python 3.6+
ffmpeg
3.4.6 Pytorch 1.0+ CPU or NVIDIA GPU + CUDA CuDNN
javaCV+openCV+
FFmpeg
实现视频帧转为
图像
并进行人脸识别(一)
NULL 博文链接:https://hwei199.iteye.com/blog/2270179
【
FFmpeg
】
FFmpeg
编
解
码H264产生马赛克、伪影的
解
决方法
使用
FFmpeg
编码H264,再
解
码
显示
时,产生马赛克:有时是在画面静止时,静止时间越长,马赛克、伪影越多;有时是在画面切入切出时;有时是在网络带宽不够时
FFmpeg
进阶-给视频添加马赛克效果
很多时候为了隐藏视频中的敏感信息如人脸、身份证号、车牌号等,我们会采用马赛克算法对视频帧中的一部分内容进行处理。这里介绍一下如何采用
FFmpeg
实现马赛克效果。2.像素替换:对于每个小块,算法会将其像素值替换为同一小块内的平均像素值或随机像素值,使得
图像
内容在该区域内变得模糊不可识别;1.分块处理:首先将
图像
划分为多个小块或区域。
FFMPEG
实现 YUV,RGB各种
图像
原始数据之间的转换(swscale)
FFMPEG
中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法。 swscale主要用于在2个AVFrame之间进行转换。 下面来看一个视频
解
码的简单例子,这个程序完成了对"北京移动开发者大会茶歇视频2.flv"(其实就是优酷上的一个普通视频)的
解
码工作,并将
解
码后的数据保存为原始数据文件(例如YUV420,YUV422,RGB24等等)。其中略去了很多的代码。 注:完整代码在文章:100
多媒体/流媒体开发
2,543
社区成员
20,281
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章