找回密码
 立即注册
搜索
热搜: 星闪 最新 活动
查看: 287|回复: 0

Android媒体播放通路及QtScrcpy镜像工具视频显示

[复制链接]

20

主题

0

回帖

180

积分

超级版主

积分
180
发表于 2025-10-24 17:31:36 | 显示全部楼层 |阅读模式
本帖最后由 xusheng 于 2025-10-24 20:01 编辑

【问题现象】

使用QtScrcpy工具,在PC上能显示腾讯视频播放的流媒体,但无法显示SDK原生播放器播放的本地媒体文件。

      【使用QtScrcpy捕捉的腾讯视频播放流媒体界面】

      【使用QtScrcpy捕捉的原生播放器播放媒体界面】

【背景知识】
1. QtScrcpy
QtScrcpy是基于Scrcpy的Qt图形化封装工具,为开发者提供了跨平台的Android设备控制方案,实现在电脑上查看和控制Android设备的屏幕。
通过adb协议与设备通信,并支持H.264编解码,以保证低延迟传输。


2. Android图形架构
Android 的图形架构可以简化为:
应用程序 (App) → 生成图形缓冲区 (GraphicBuffer) → SurfaceFlinger (合成器) → 屏幕显示
  • 应用将其要显示的内容绘制到一系列的 GraphicBuffer(图形缓冲区)中
  • SurfaceFlinger是 Android 系统的显示合成服务,它收集所有应用窗口的 GraphicBuffer,根据Z-order、位置、透明度等信息,将它们合成为最终一帧的图像,然后送显示输出




3. QtScrcpy获取Android设备显示数据的方式
QtScrcpy 正是在Android设备 SurfaceFlinger完成合成之后,送显之前的这个环节获取数据,然后再编码传输到远程的PC端显示。
SurfaceFlinger在合成时,会检查每个 GraphicBuffer的属性:
  • 普通缓冲区 (Non-Secure Buffer)​​:来自大多数应用,SurfaceFlinger会正常合成,并允许复制;
  • 安全缓冲区 (Secure Buffer)​​:当一个应用(如DRM保护的视频播放器)创建其画面时,它可以请求分配带有 GRALLOC_USAGE_PROTECTED标志的缓冲区。QtScrcpy等外部服务请求获取最终帧时,SurfaceFlinger直接拒绝提供这一帧,或者将安全内容区域替换为黑屏;


【问题分析】
用SDK原生播放器播放本地普通媒体时,QtScrcpy显示为黑屏,显然不是与该媒体文件受DRM保护相关,而是因为其它原因导致。


【海思媒体播放通路】
在 Android 系统中,​MediaPlayer​ 和 ​MediaCodec​ 是两种不同的媒体处理通路,适用于不同的应用场景,底层实现和架构也有显著差异。

MediaPlayer​通路:
  • 封装了完整的媒体播放流程(解封装、解码、音视频同步、渲染),适合快速实现播放功能;
  • 依赖底层系统实现,海思原生SDK播放器采用,视频通路如下图所示,




MediaCodec通路:
  • 提供对编解码器的直接控制,允许开发者手动处理数据流,除编解码外媒体播放涉及的处理工作都需要APP自行实现
  • 腾讯视频、爱奇艺等APK采用,视频通路如下图所示,





【分析结论】
1. 腾讯视频APK采用MediaCodec解码方式,视频解码后的输出传输给Surfaceflinger,再与UI混合后送显示输出,所以QtSrccpy能够获取到视频图像;
2. 海思SDK原生播放器采用MediaPlayer解码,并配合私有的VO Sideband显示通路,播放器解码后的视频直接送显输出,并没有交给SurfaceFlinger进行混合,因此QtScrcpy抓取不到视频图像,QtScrcpy软件相应的显示位置为黑屏。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【淇诺科技】技术论坛 ( 粤ICP备14010465号-1|粤ICP备14010465号-1 )

GMT+8, 2026-4-2 15:52 , Processed in 0.127620 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表