把安卓手机声音同步到电脑:QtScrcpy 音频传输完整指南(3 步配置)
【免费下载链接】QtScrcpyAndroid real-time display control software项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy
QtScrcpy 是一款基于 Qt 的 Android 实时投屏控制软件,除了镜像画面和键鼠操作,它还能把手机扬声器的声音实时同步到电脑播放,这就是本文要讲的音频传输功能。接下来我会先讲清"为什么投屏了却没声音",再带你用 3 步把手机声音接到电脑音箱上,最后拆解 sndcpy 与 AudioOutput 背后的数据链路,并附上一份常见问题的避坑清单。
🤔 先说痛点:投屏画面很流畅,电脑为什么没声音?
不少用户第一次连接设备后会发现:画面实时跟手、操作也灵敏,唯独电脑这边一点声音都没有。
原因并不复杂——投屏协议本身只负责视频帧和输入事件的搬运,音频数据始终留在手机里。QtScrcpy 为此引入了开源工具 sndcpy,补上这条"声音通道":手机端捕获系统音频流,通过 ADB 端口转发送出来,电脑端再实时解码播放。
你可以这样理解:画面走一条管道,声音走另一条,QtScrcpy 负责把第二条管道接好。
下面是 QtScrcpy 的主界面,音频相关的按钮就在界面里:
🚀 最快配置方法:3 步启动手机声音同步
第一步:连上设备并开启 USB 调试
用 USB 线(或先完成无线连接)把安卓设备接入电脑,确认设备已启用 USB 调试,并在程序左上角的设备列表里能看到它的序列号。没有设备时,后面的按钮点了也不会生效——程序会直接提示 "No device is connected!"。
第二步:确认 sndcpy 已装好
点start audio时程序会自动处理安装;如果你只想先把应用装到手机上,可以单独点install sndcpy按钮。
这一步的实际工作由 QtScrcpy/sndcpy/ 目录下的脚本完成(Windows 走sndcpy.bat,Linux/macOS 走sndcpy.sh),流程大致是:
- 通过
pm path com.rom1v.sndcpy检查 sndcpy.apk 是否已安装,没装就自动安装; - 用
appops set com.rom1v.sndcpy PROJECT_MEDIA allow授予音频捕获权限; - 执行
adb forward tcp:28200 localabstract:sndcpy,把手机的音频 socket 转发到本机 28200 端口; - 启动 sndcpy 的 MainActivity,并轮询确认进程已运行。
第三步:点击 start audio,听声音
对应源码在 QtScrcpy/ui/dialog.cpp 里,核心就一行:
m_audioOutput.start(ui->serialBox->currentText(), 28200);传入当前选中设备的序列号,端口固定为 28200。点stop audio则会调用stop()关闭接收线程和音频输出,整个过程无需重启程序。
连上设备后,先投屏、再开声音,画面与声音就同步到电脑了:
🔍 背后原理:声音是怎么"跑"到电脑音箱的?
手机端:sndcpy 捕获音频流
sndcpy 是一个专门的安卓音频转发应用(包名com.rom1v.sndcpy),它利用系统媒体投影能力把手机正在播放的声音截获出来,挂到一个名为sndcpy的本地 abstract socket 上。ADB 的端口转发命令就是把它"桥"到电脑本地 28200 端口。
电脑端:AudioOutput 接收并播放
真正干活的类是AudioOutput(定义在 QtScrcpy/audio/audiooutput.h,实现在 QtScrcpy/audio/audiooutput.cpp),它对外提供三个方法:
start(serial, port):拉起 sndcpy 脚本,并启动音频输出与数据接收;stop():停止接收线程、释放音频设备;installonly(serial, port):只执行安装,不开始播放。
数据接收部分用一个独立的QThread承载QTcpSocket,连接本机 28200 端口后,每当readyRead触发就把字节读出来直接写入音频输出设备。音频格式是固定值:48000 Hz 采样率、双声道、16-bit 有符号 PCM(audio/pcm);Qt 5 使用QAudioOutput(并设置了约 0.3 秒的播放缓冲,用来吸收网络抖动),Qt 6 则切换为QAudioSink。
整条链路可以浓缩成一张表:
| 环节 | 负责方 | 说明 |
|---|---|---|
| 捕获音频 | sndcpy.apk(手机端) | 截取系统音频,挂到 localabstract:sndcpy |
| 跨端搬运 | ADB 端口转发 | tcp:28200↔localabstract:sndcpy |
| 接收数据 | QTcpSocket+ 工作线程 | 连本机 28200 端口,500ms 连接超时 |
| 解码播放 | QAudioSink/QAudioOutput | 48kHz / 立体声 / 16-bit PCM 直出 |
游戏、视频这类对音画同步有要求的场景,这套方案都能覆盖:
🌍 进阶:跨平台与多设备怎么玩
- 全平台一致:Windows、macOS、Linux 下操作完全相同,只有 sndcpy 的启动脚本不同(
.bat与bash .sh的切换在runSndcpyProcess()里按系统宏处理)。macOS 下的界面如下:
- 多设备分组:QtScrcpy 支持同时镜像多台设备并分组控制(见 docs/ 中的演示),每台设备各自独立启停音频互不干扰:
- 全局参数:
config/config.ini里的AdbPath、MaxFps等参数作用于整体投屏行为;音频端口(28200)与采样格式则由代码固定,普通用户无需改动。
⚠️ 避坑清单:常见问题一次说清
| 现象 | 原因与处理 |
|---|---|
| 点 start audio 没反应 | 设备列表为空,先连接设备;或设备Android 版本低于 10(sndcpy 仅支持安卓 10 以上) |
| 提示权限或安装失败 | 重新点一次install sndcpy,脚本会自动卸载重装并重新申请PROJECT_MEDIA权限 |
| adb 相关报错 | 常见于电脑里同时存在多个 adb 版本,参考 docs/FAQ.md 统一版本即可 |
| 连接偶发失败 | 接收端对 28200 端口的连接等待是 500ms,确认设备在线、USB 连接稳定后重试 |
| 体验不满意 | 官方 README 目前对该方案持保留态度(标注"目前不推荐使用"),追求稳定也可以直接给手机配对蓝牙耳机,电脑端监听 |
注意这里:整个音频传输不需要 root,全程依赖标准 ADB 能力,这也是它开箱即用的前提。
写在最后
回到开头的问题:投屏没声音,是因为声音通道原本就不存在;而 QtScrcpy 用 sndcpy +AudioOutput这套"端上捕获、ADB 转发、本地播放"的组合,把这条通道以固定 28200 端口、48kHz PCM 的形态补了起来,且无需 root、三端通用。
现在不妨连上你的设备,点一下 start audio——手机里的音乐和提示音,几秒内就会从电脑音箱里响出来。
【免费下载链接】QtScrcpyAndroid real-time display control software项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考