用FFMPEG解出来的图像显示有马塞克,怎么回事?用FFMPEG解出来的图像显示有马塞克,怎么回事?我用LIVE555接收
用FFMPEG解出来的图像显示有马塞克,怎么回事?
用FFMPEG解出来的图像显示有马塞克,怎么回事?
我用LIVE555接收,开了BUFFER,解出来的图像显示有马塞克,我怀疑是网络丢包的问题。。
这时我试了下播放本地文件,还是一样的效果,而且还会闪烁,有条扫描线在来回抖动,请问这是怎么回事啊?
是解码的问题还是显示的问题?我显示是用FFMPEG解出的YUV420格式直接写屏。。
[解决办法]
扫描线在来回抖动,是制式的问题,比如视频源是NTSC,你按PAL采集编码经常会出现这种情况。
马塞克有两种:
一种是丢失数据引起的,另一种是压缩过大,比如下载的rmvb电影经常有。
如果能确定你的文件播放过程没有丢失数据(播放一帧同时写一帧到文件,然后和原始文件比较),那就是码流设置的问题了,设置大一些试试。
[解决办法]
VLC本身有丢包处理,所以就算网络堵塞,丢很多包,最多是卡,不会马塞克。
SDL只是个图像显示库,本身没有网络传输功能吧,传输这部分你怎么做的?问题应该出在这里
[解决办法]
你是用ffmpeg.exe解码,还是用libavcodec.dll?
如果用libavcodec,要仔细参考ffmpeg.c,上面解码是放到一个环形缓冲里的,循环,等这一帧完全解好,再发到Render上。你自己解码,可能解一帧就播放一帧,没注意这一帧解码是否完全解好。如果某帧解不完全,就有mosaic现象。
[解决办法]
[解决办法]//这一句是解码,解成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之后很正常。你参考一下。