ijlplayer-花屏问题分析

本文详细探讨了ijlplayer在S2设备上出现的花屏问题,从显示、解复用、解码和渲染四个角度进行排查。通过编码图片判断显示问题,检查解复用器的关键帧处理,分析解码器工作状态,以及识别渲染过程中的不匹配。针对不同场景,提出了具体的解决策略,如修正解复用器索引错误、调整解码器参数、适配渲染格式等。
摘要由CSDN通过智能技术生成

今天遇到个应用在S2机器上拖动播放随机花屏的问题,其他机子都没有。那么如何分析花屏问题呢,我这里主要分析点播和本地文件播放导致的花屏,并不涉及直播花屏分析?

分析花屏问题无外乎从解复用->解码->显示这三步开始排查。(好吧,这个花屏问题真的让人蛋疼啊)

1.排查是否显示问题

先从显示开始排查,可以直接把解码后的数据编码成图片然后取出来,如果取出来的图片是花屏的,那么就继续往解码以及解复用开始排查。如果取出来的图片不是花屏的,那么就可以判断为显示导致的花屏。

先看下在jik中对解码后的帧编码图片取到本地的实现方式:

我们需要先获取到软解码后的帧数据,在ff_ffplay的ffplay_video_thread函数中,这里直接取。

int i = 0;//作为编码成图片的帧序列号,函数外
...
...
for (;;) {
//软解码获取到解码后的视频帧
        ret = get_video_frame(ffp, frame);
        if (ret < 0)
            goto the_end;
        if (!ret)
            continue;
		//add by hxk,花屏检测的实现方式
		#if 0
			AVFrame *pFrameRGB;
			pFrameRGB = av_frame_alloc();//申请内存
			if(pFrameRGB == NULL) {
				av_log(NULL, AV_LOG_ERROR, "pFrameRGB malloc failed!\n");
				return;
			}
			int numBytes = avpicture_get_size(AV_PIX_FMT_RGB24, is->viddec.avctx->width, is->viddec.avctx->height);
			uint8_t * buffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));
	    	avpicture_fill((AVPicture*)pFrameRGB, buffer, AV_PIX_FMT_RGB24, is->viddec.avctx->width, is->viddec.avctx->height);
			struct SwsContext* img_convert_ctx;
			img_convert_ctx = sws_getContext(is->viddec.avctx->width,is->viddec.avctx->height, frame->format,
				is->viddec.avctx->width, is->viddec.avctx->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
			sws_scale(img_convert_ctx,  (const uint8_t * const *)frame->data, (const int *)frame->linesize, 0, is->viddec.avctx->height, 
					pFrameRGB->data, pFrameRGB->linesize);
			
			SaveFrame(pFrameRGB, is->viddec.avctx->width, is->viddec.avctx->height, i++);
			av_free(buffer);
			av_free(pFrameRGB);
			sws_freeContext(img_conv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值