关于 android 6.0 上的 nuplayer 播放时的图像卡顿

博客分析了在Android 6.0系统上使用nuplayer播放视频时出现图像卡顿的问题。通过systrace进行性能跟踪,发现surfaceFlinger进程未显示异常。内容探讨了queueBuffer操作与numFramesPlayed之间的关系,指出当numFramesPlayed增长不符合预期时,可能导致timestampNs的突变,从而引起ANW原地等待,造成播放卡顿。
摘要由CSDN通过智能技术生成
作为一个和 android nuplayer 打了 N年交道, 自以为已经上古司机的老码农, 这一次居然被坑了一个礼拜;
事情描述起来很简单, 测试人员突然发现目前的版本,播放很多视频都卡顿, 由于该项目在几个月之前就已经基本收敛, 实际上近几个月大家都是没怎么测试的; 测试突然报了一堆类似异常过来, 直接把问题级别拉到最高了; // MAGIC1. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/

由于很多低分辨率的码流也卡顿, 因此我们也就不去怀疑 Video Decoder 本身的性能问题, 更倾向于上层的异常; 关掉音频的实验, 也侧面证实了这一点, 直接关掉音频的输出, 在 NuPlayer.cpp 中
             if (mAudioSink != NULL && mAudioDecoder == NULL) {
-                instantiateDecoder(true, &mAudioDecoder);
+                //instantiateDecoder(true, &mAudioDecoder);
             }

然后图像就完全不卡了;
这直接说明就是音画同步的策略问题, 或者音频时间戳的问题嘛...  再见  // MAGIC2. DO NOT TOUCH.  BY 冗戈微言  http://blog.csdn.net/leonxu_sjtu/



为了更确认这点, 我把 NuPlayer::Renderer::postDrainVideoQueue 直接将 delayUs 置零, 也就是说避开 audio 时间戳的影响, kWhatDrainVideoQueue 的消息发送不做任何延迟, 可是测下来却是图像依然卡顿; 
一下子有点懵, 什么情况, 难道音频 onDrainAudioQueue 的消息处理那几毫秒的耗时, 会对视频消息 kWhatDrainVideoQueue  产生这么大的影响? 
加打印,很快打出来, 此时耗时点是在 ACodec 的  mNativeWindow->dequeueBuffer, 这里会阻塞超过 100毫秒;

抓了个 systrace, 也确认了这点, 但 systrace 上的 surfaceFlinger 进程也看不出什么异常;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值