Bug: 音频/视频编码选非默认值时,命令行参数被错误拼接
环境
- scrcpy-helper 1.5.0
- scrcpy 4.1
- Windows 10 20H2
- PowerShell 5.1
问题描述
当设置中「音频编码」或「视频编码」选为非默认值(如 flac、av1)时,投屏会报错,错误信息中编码值与后续参数被错误拼接在一起:
音频编码选 flac 时:
ERROR: Unsupported audio codec: flac--gamepad=uhid --turn-screen-off --keep-active (expected opus, aac, flac or raw)
视频编码选 av1 时:
ERROR: Unsupported video codec: av1--gamepad=uhid --turn-screen-off --keep-active (expected h264, h265, av1, vp8 or vp9)
注意 flac/av1 和 --gamepad=uhid 之间没有空格,scrcpy 将后续参数错误地拼入了编解码器的值中。
复现步骤
- 打开投屏助手 → 设置 → 声音 → 音频编码选
flac
或 → 设置 → 画面 → 视频编码选 av1
- 确认控制设置中已开启手柄、投屏关屏、保持唤醒
- 点击投屏
临时解决办法
把音频编码/视频编码改回空(默认值),投屏恢复正常。
根因分析
Start-Scrcpy 函数(第 546 行)和 Invoke-Hidden 函数(第 170 行)中,参数拼接逻辑如下:
$cmd = (@($clean | ForEach-Object {
if ($_ -match '[\s"]') {
'"' + ($_ -replace '"', '""') + '"'
} else {
$_
}
}) -join ' ')
从代码逻辑看,-join ' ' 应该在每个参数之间加入空格,参数拼接应该是正确的。但在实际运行中,某些环境下(可能与 PowerShell 版本或 Start-Process 的 UseShellExecute 默认行为有关),--video-codec=av1 和紧随其后的 --gamepad=uhid 被合并为一个 token 传给了 scrcpy。
值得注意的观察:
- 相同的参数用命令行直接传给 scrcpy.exe 是正常的
- 用
Start-Process -ArgumentList $cmd 传参在测试环境中也无法稳定复现
- 但用户实际运行时确实遇到了此问题,且重开助手后仍可复现
可能的相关因素:
Invoke-Hidden 函数(第 170 行)的 replace 目标之前是 \"(反斜杠+引号),在 Windows 命令行中 \" 会被 CommandLineToArgvW 解析为字面量 " 而非引号包裹,可能导致参数边界解析异常
Start-Process 默认 UseShellExecute=$true,走 ShellExecuteEx 路径传参,行为可能与 CreateProcess 有差异
建议修复方向
- 将
Start-Scrcpy 中 Start-Process 改为 UseShellExecute=$false,直接走 CreateProcess 路径传参,避免 ShellExecuteEx 的潜在参数处理差异
- 或者改用
ProcessStartInfo 直接创建进程(Invoke-Hidden 函数已采用此方式,运行稳定),统一两种启动方式
- 确保
Invoke-Hidden(第 170 行)和 Start-Scrcpy(第 546 行)的引号转义逻辑一致——replace 目标应为 ""(Windows 双引号转义)而非 \"
附注
- 将音频编码/视频编码改回默认值后问题消失
- 仅在显式指定非默认编码时触发
- 该问题在 1.5.0 版本中可复现
Bug: 音频/视频编码选非默认值时,命令行参数被错误拼接
环境
问题描述
当设置中「音频编码」或「视频编码」选为非默认值(如 flac、av1)时,投屏会报错,错误信息中编码值与后续参数被错误拼接在一起:
音频编码选 flac 时:
视频编码选 av1 时:
注意
flac/av1和--gamepad=uhid之间没有空格,scrcpy 将后续参数错误地拼入了编解码器的值中。复现步骤
flac或 → 设置 → 画面 → 视频编码选
av1临时解决办法
把音频编码/视频编码改回空(默认值),投屏恢复正常。
根因分析
Start-Scrcpy函数(第 546 行)和Invoke-Hidden函数(第 170 行)中,参数拼接逻辑如下:从代码逻辑看,
-join ' '应该在每个参数之间加入空格,参数拼接应该是正确的。但在实际运行中,某些环境下(可能与 PowerShell 版本或Start-Process的UseShellExecute默认行为有关),--video-codec=av1和紧随其后的--gamepad=uhid被合并为一个 token 传给了 scrcpy。值得注意的观察:
Start-Process -ArgumentList $cmd传参在测试环境中也无法稳定复现可能的相关因素:
Invoke-Hidden函数(第 170 行)的 replace 目标之前是\"(反斜杠+引号),在 Windows 命令行中\"会被CommandLineToArgvW解析为字面量"而非引号包裹,可能导致参数边界解析异常Start-Process默认UseShellExecute=$true,走ShellExecuteEx路径传参,行为可能与CreateProcess有差异建议修复方向
Start-Scrcpy中Start-Process改为UseShellExecute=$false,直接走CreateProcess路径传参,避免ShellExecuteEx的潜在参数处理差异ProcessStartInfo直接创建进程(Invoke-Hidden函数已采用此方式,运行稳定),统一两种启动方式Invoke-Hidden(第 170 行)和Start-Scrcpy(第 546 行)的引号转义逻辑一致——replace 目标应为""(Windows 双引号转义)而非\"附注