作为一个和 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/
一下子有点懵, 什么情况, 难道音频 onDrainAudioQueue 的消息处理那几毫秒的耗时, 会对视频消息 kWhatDrainVideoQueue 产生这么大的影响?
加打印,很快打出来, 此时耗时点是在 ACodec 的 mNativeWindow->dequeueBuffer, 这里会阻塞超过 100毫秒;
事情描述起来很简单, 测试人员突然发现目前的版本,播放很多视频都卡顿, 由于该项目在几个月之前就已经基本收敛, 实际上近几个月大家都是没怎么测试的; 测试突然报了一堆类似异常过来, 直接把问题级别拉到最高了; // 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/
一下子有点懵, 什么情况, 难道音频 onDrainAudioQueue 的消息处理那几毫秒的耗时, 会对视频消息 kWhatDrainVideoQueue 产生这么大的影响?
加打印,很快打出来, 此时耗时点是在 ACodec 的 mNativeWindow->dequeueBuffer, 这里会阻塞超过 100毫秒;
抓了个 systrace, 也确认了这点, 但 systrace 上的 surfaceFlinger 进程也看不出什么异常;