如何拦截解析Android应用内视频 验证画质切换实际效果
Appium+JS 实现Android应用视频画质切换真实性校验
仅靠拦截API返回结果无法完成校验,接口返回的画质字段很可能和实际播放内容不符,必须拿到实际播放的视频内容做参数解析,和切换前的基准片段比对,才能确认画质真的变了。
实现步骤
- 环境前置准备
提前配置好Appium JS驱动,连接开启USB调试的Android测试机,准备好ffmpeg/ffprobe二进制文件(可以直接push到安卓设备端调用,也可以在跑脚本的PC端安装,用来解析视频参数),给测试应用开存储、录屏权限,避免后续采集视频失败。 - 采集切换前基准视频片段
打开待测视频播放页,等视频加载稳定、正常播放3秒以上再开始采集,两种采集方式选一种就行,优先选第二种:- 调用Appium自带的
startRecordingScreen接口录10~15秒的播放内容,录完拉到本地存为基准片段 - 如果能拿到应用的视频缓存目录权限,直接用
adb pull拉取当前正在播放的视频缓存分片,比录屏的结果准,不会被系统录屏的压缩逻辑干扰
采完直接解析基准片段的核心画质参数存下来,示例代码:
const { execSync } = require('child_process'); // 调用ffprobe解析视频核心画质指标 const parseVideoQuality = (videoPath) => { const probeCmd = `ffprobe -v error -print_format json -show_streams "${videoPath}"`; const streamData = JSON.parse(execSync(probeCmd).toString()); const videoTrack = streamData.streams.find(item => item.codec_type === 'video'); return { width: videoTrack.width, height: videoTrack.height, bitrate: Number(videoTrack.bit_rate), fps: eval(videoTrack.r_frame_rate), // 把ffprobe返回的分数型帧率转成数值 } } const baseQuality = parseVideoQuality('./base_segment.mp4'); - 调用Appium自带的
- 触发画质切换操作
用Appium定位到应用内的画质选择控件,点击要测试的目标画质档位,操作完等5~10秒,等播放器把新画质的分片加载完、缓冲稳定,别刚点完就采集,容易拿到切换过程中的过渡片段。 - 采集切换后视频片段
和采基准片段的方式、时长完全保持一致,采完调用同一个parseVideoQuality方法,拿到切换后的画质参数。 - 做参数比对校验
别写死参数完全相等的判断,要按画质档位设合理阈值,避免录屏压缩、视频内容波动导致误判,参考逻辑:const assert = require('assert'); // 提前按自己业务的画质档位配置阈值 const qualityLevelMap = { '360P': { minHeight: 340, minBitrate: 300000 }, '720P': { minHeight: 700, minBitrate: 1200000 }, '1080P': { minHeight: 1060, minBitrate: 2500000 } } const verifyQualityChange = (baseData, targetData, targetLevel, isUpgrade = true) => { const targetExpect = qualityLevelMap[targetLevel]; // 先校验参数是否符合目标档位的最低要求 assert.ok(targetData.height >= targetExpect.minHeight, `分辨率不达标,实际高度${targetData.height},要求≥${targetExpect.minHeight}`); assert.ok(targetData.bitrate >= targetExpect.minBitrate, `码率不达标,实际码率${targetData.bitrate},要求≥${targetExpect.minBitrate}`); // 再校验和原画质比有符合预期的显著差异 if (isUpgrade) { assert.ok(targetData.bitrate > baseData.bitrate * 1.4, '切换后码率无明显提升,画质未真实变更'); } else { assert.ok(targetData.bitrate < baseData.bitrate * 0.7, '切换后码率无明显下降,画质未真实变更'); } } // 示例:校验从低画质切到1080P是否生效 verifyQualityChange(baseQuality, targetQuality, '1080P', true);
实操提示:尽量选动态画面多的视频片段做测试,静态画面下高低画质的码率、分辨率差异可能很小,容易误判;如果应用有DRM加密没法直接拉缓存,就固定用同一台设备、同一个录屏参数采集,把录屏本身的画质影响降到最低。
内容的提问来源于stack exchange,提问作者Павел Родин
相关产品推荐
相关产品推荐

