Escrcpy 音频转发完全指南:Android 11+ 音频捕获、音源选择与编解码调优
【免费下载链接】escrcpy📱 Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy
导读:本文围绕 escrcpy 所集成的 scrcpy(v3.2)音频转发能力展开,系统讲解 Android 11+ 设备音频捕获的版本前提、
--no-audio等开关参数、--audio-source全部音源语义、编解码器/编码器选择、码率与缓冲调优,并结合 escrcpy 仓库中的偏好配置模型与 scrcpy 进程封装源码,给出可在真实设备上直接复制的命令行与图形界面配置方案。读完本文,你将能够按需开启/关闭音频、把手机当作录音笔、切换麦克风音源、修复 Opus 编码器缺失报错,并针对卡顿音质做缓冲优化。
一、音频转发的前置条件:Android 版本决定一切
音频转发(Audio forwarding)并不是所有 Android 设备都能开启的,它严格依赖系统版本,官方支持基线为Android 11(API 30)及以上:
| 设备系统版本 | 音频捕获表现 |
|---|---|
| Android 12 及以上 | 开箱即用(out-of-the-box),无需任何额外操作 |
| Android 11 | 需要保证启动 scrcpy 时设备屏幕处于解锁状态;启动瞬间会短暂弹出一个伪装弹窗,让系统误以为 shell 应用处于前台,否则音频捕获会失败 |
| Android 10 及更早 | 无法捕获音频,音频会被自动禁用 |
这一版本门槛在 escrcpy 仓库的文档中也有对应说明:docs/en/reference/scrcpy/index.md 的 Prerequisites 一节明确指出「Audio forwarding is supported for API >= 30 (Android 11+)」,同时基础镜像门槛是 Android 5.0(API 21)。
失败兜底:音频丢了,画面不能丢
音频默认开启,但设计原则是「音频不可用时绝不让 scrcpy 整体失败」,因此:
- 如果音频捕获失败,镜像会自动降级为仅视频继续运行;
- 只有显式传入
--require-audio时,音频缺失才会被视为致命错误导致进程退出:
scrcpy --require-audio # 音频捕获失败则直接报错退出二、开关音频:--no-audio与--audio-dup
完全关闭音频
scrcpy --no-audio如果只想关闭音频播放(仍然捕获/录制),可参考 video.md 的 No playback 一节(对应--no-playback)。
音频重复播放(Duplication)
默认音源output会把设备播放的音频全部「搬」到电脑端,设备自身静音。如果你希望镜像的同时设备也在出声,可以使用 Android 13+ 专属的重复播放能力:
scrcpy --audio-source=playback --audio-dup # 简写:--audio-dup 会自动隐含 --audio-source=playback scrcpy --audio-dup注意两个限制:需要Android 13 及以上;且该方式依赖系统对应用播放内容的捕获,应用可以选择退出(opt-out),因此不一定能捕获到全部音频。
三、纯音频模式:把手机变成无线麦克风/录音笔
音频可以和视频、控制完全解耦,Escrcpy/scrcpy 允许只转发音频:
# 仅播放音频:禁用视频与控制 scrcpy --no-video --no-control # 不开任何窗口、只播放音频(--no-window 隐含 --no-video 与 --no-control) scrcpy --no-window # 使用 Ctrl+C 中断纯音频模式下延迟不再是关键指标,可以适当加大缓冲来消除爆音,见后文「缓冲调优」。
一个非常实用的组合:把设备当作录音笔,直接在电脑上录制:
scrcpy --audio-source=mic --no-video --no-playback --record=file.opus即:捕获设备麦克风 → 不做视频 → 不在设备/电脑上实时播放 → 直接录制为 Opus 文件。
四、音源选择:--audio-source十一种取值详解
默认转发的是设备音频输出(output)。--audio-source允许切换到麦克风、通话声道等,取值及对应 AndroidMediaRecorder.AudioSource映射如下:
| 取值 | 语义 | Android 音频源映射 |
|---|---|---|
output(默认) | 转发全部音频输出,设备端播放被静音 | REMOTE_SUBMIX |
playback | 捕获应用播放的音频(应用可 opt-out,不一定完整) | 基于系统捕获 API(Android 13+) |
mic | 捕获麦克风 | MIC |
mic-unprocessed | 捕获未经处理的原始麦克风声音 | UNPROCESSED |
mic-camcorder | 针对录像调音的麦克风捕获(可用时与摄像头同朝向) | CAMCORDER |
mic-voice-recognition | 针对语音识别调音的麦克风捕获 | VOICE_RECOGNITION |
mic-voice-communication | 针对语音通话调音(可启用回声消除、自动增益) | VOICE_COMMUNICATION |
voice-call | 捕获语音通话 | VOICE_CALL |
voice-call-uplink | 仅捕获通话上行(本机说话声) | VOICE_UPLINK |
voice-call-downlink | 仅捕获通话下行(对方说话声) | VOICE_DOWNLINK |
voice-performance | 面向现场演出(如卡拉 OK)处理,同时包含麦克风与设备播放 | VOICE_PERFORMANCE |
典型用法:
scrcpy --audio-source=mic # 用设备麦克风代替设备扬声器输出在 escrcpy 的偏好设置模型中,上述全部音源都已内置为可选项,见 desktop/src/models/preference/audio/index.js 中audioSource的options列表(playback、mic、mic-unprocessed、mic-camcorder、mic-voice-recognition、mic-voice-communication、voice-call、voice-call-uplink、voice-call-downlink、voice-performance),选中后会以--audio-source=<value>追加到 scrcpy 启动参数中。
五、编解码器:--audio-codec与 Opus 报错修复
音频编解码器可选opus(默认)、aac、flac、raw(未压缩的 PCM 16-bit 小端):
scrcpy --audio-codec=opus # 默认 scrcpy --audio-codec=aac scrcpy --audio-codec=flac scrcpy --audio-codec=raw高频坑:如果设备没有 Opus 编码器,会报如下错误:
Failed to initialize audio/opus, error 0xfffffffe解决方案就是切换到 AAC:
scrcpy --audio-codec=aac高级:--audio-codec-options透传 MediaFormat 参数
--audio-codec-options可以把任意参数直接透传给 Android 的MediaFormat(具体键值可查阅scrcpy --help与 manpage)。例如调整 FLAC 压缩级别:
scrcpy --audio-codec=flac --audio-codec-options=flac-compression-level=8这里flac-compression-level对应MediaFormat.KEY_FLAC_COMPRESSION_LEVEL(0 为最快、8 为最高压缩比)。
六、编码器选择:--list-encoders与--audio-encoder
同一设备上可能同时存在多个可用编码器,先枚举:
scrcpy --list-encoders再锁定指定编码器:
scrcpy --audio-codec=opus --audio-encoder='c2.android.opus.encoder'escrcpy 仓库对这一能力做了完整封装,可作为实现参考:
- 进程层:
getEncoders(serial)通过createScrcpyProcess执行scrcpy --serial="<serial>" --list-encoders,见 desktop/electron/middleware/scrcpy/index.js; - 解析层:
parseScrcpyCodecList把输出中形如--audio-codec=opus --audio-encoder=c2.android.opus.encoder的行解析为结构化{ video: [], audio: [] }列表,见 desktop/electron/middleware/scrcpy/helper.js; - 界面层:音频编解码选择组件在点击下拉时实时调用
$scrcpy.getEncoders(deviceId)拉取设备真实可用编码器,并把选中值拆分为--audio-codec与--audio-encoder两个参数,见 desktop/src/components/preference-form/components/select-audio-codec/index.vue。
也就是说,escrcpy 的「音频编解码」设置项并非写死选项,而是基于目标设备真实编码器动态生成的。仓库默认预设了opus & c2.android.opus.encoder、aac & c2.android.aac.encoder、aac & OMX.google.aac.encoder、raw四组(见 desktop/src/models/preference/audio/index.js 的audioCode配置)。
七、码率:--audio-bit-rate
默认音频码率为128Kbps,可自由调整:
scrcpy --audio-bit-rate=64K scrcpy --audio-bit-rate=64000 # 与上面等价注意:该参数对
raw编解码器不生效(raw 为未压缩 PCM,码率由采样格式决定)。
在 escrcpy 偏好模型中该字段类型为Input,单位后缀为bps,用户输入的值会直接拼接到--audio-bit-rate之后(见 desktop/src/models/preference/audio/index.js 的audioBitRate配置)。
八、缓冲调优:--audio-buffer与--audio-output-buffer
音频缓冲无法避免:太小则延迟低但容易欠载(buffer underrun)导致爆音/卡顿,太大则延迟高。默认目标缓冲 50ms,可按需调整:
scrcpy --audio-buffer=40 # 比默认更小,追求低延迟 scrcpy --audio-buffer=100 # 比默认更大,追求顺滑两点说明:
- 该参数设置的是目标缓冲,实际是否达到受设备/传输状况影响(频繁欠载时可能达不到);
- 若只是纯看视频不操作设备,可以同时调高音视频缓冲来平滑播放:
scrcpy --video-buffer=200 --audio-buffer=200(视频缓冲的详细说明见 video.md 的 Buffering 一节。)
还有一个音频输出缓冲(audio output buffer),默认仅 5ms,除非遇到机器人音/杂音(robotic and glitchy sound)问题,否则不建议改动:
# 仅在确有必要时 scrcpy --audio-output-buffer=10escrcpy 偏好模型将--audio-buffer与--audio-output-buffer均以InputNumber+ms后缀暴露在设置界面中(见 desktop/src/models/preference/audio/index.js 的audioBuffer/audioOutputBuffer配置),方便按设备逐一调优。
九、在 Escrcpy 图形界面中的完整对应关系
本文讲到的绝大多数参数,escrcpy 都已映射为图形化偏好设置项,汇总如下(配置模型见 desktop/src/models/preference/audio/index.js):
| 命令行参数 | 界面设置项 | 控件类型 | 说明 |
|---|---|---|---|
--no-audio | 禁用音频 | Switch | 关闭音频转发 |
--audio-dup | 音频重复播放 | Switch | Android 13+,设备端同时出声 |
--audio-source | 音频源 | Select | 上述 11 种音源可选 |
--audio-codec+--audio-encoder | 音频编解码 | AudioCodecSelect | 基于--list-encoders动态生成 |
--audio-bit-rate | 音频码率 | Input(bps) | 默认 128Kbps |
--audio-buffer | 音频缓冲 | InputNumber(ms) | 默认 50ms |
--audio-output-buffer | 音频输出缓冲 | InputNumber(ms) | 默认 5ms |
此外,escrcpy 的「音频录制」能力也围绕这些参数做了专门组合:录音模式会自动排除--no-audio、追加--no-video --mouse=disabled,并以--audio-record-format(默认opus)决定录制文件扩展名(见 desktop/src/hooks/use-record-action/index.js),进程层则通过scrcpy --serial="<serial>" --record="<savePath>" ...启动录制(见 desktop/electron/middleware/scrcpy/index.js)。
十、实战组合速查
把以上知识组合起来,覆盖常见场景:
# 1. 只看视频不操作,追求画面与声音顺滑 scrcpy --video-buffer=200 --audio-buffer=200 # 2. 用手机麦克风直接在电脑录制 Opus(录音笔模式) scrcpy --audio-source=mic --no-video --no-playback --record=file.opus # 3. 设备无 Opus 编码器时的备选 scrcpy --audio-codec=aac # 4. 镜像同时设备也出声(Android 13+) scrcpy --audio-dup # 5. 低延迟音频转发 scrcpy --audio-buffer=40 --audio-output-buffer=5 # 6. 只保留音频、不开任何窗口(后台听音) scrcpy --no-window --audio-buffer=200本文内容出处:核心参数与语义全部继承自仓库文档 docs/en/reference/scrcpy/audio.md,界面映射与实现细节经仓库源码(偏好模型、scrcpy 中间件、录制 Hook)交叉验证。注意本文参数基于 escrcpy 所集成的 scrcpy v3.2 版本,具体可用性以scrcpy --help与设备系统版本为准。
【免费下载链接】escrcpy📱 Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考