使用Rust std::process向CLI版MPV发送"p"按键无响应问题
解决Rust程序与CLI版MPV交互时无法暂停的问题
你已经确认按键事件捕获和写入操作正常,但MPV未响应暂停命令,排除flush相关问题后,可从以下方向排查解决:
1. 强制MPV启用标准输入命令解析
默认情况下,当MPV的标准输入是管道(而非交互式终端)时,它不会主动监听stdin的命令输入。需添加--input-stdin=yes参数,强制MPV从标准输入读取控制命令:
let mut output = Command::new("mpv") .arg(selected_song.unwrap()) .arg("--no-video") .arg("--vo=null") .arg("--video=no") .arg("--input-stdin=yes") // 新增此参数 .stdin(Stdio::piped()) .spawn() .expect("Failed to execute command");
2. 确保命令以换行符结束
MPV的终端交互命令需要以换行符作为完整命令的标记,单独发送b"p"可能无法被MPV识别。修改写入内容为:
let _ = mpv_stdin.write_all(b"p\n");
(若仍有延迟,可显式调用mpv_stdin.flush().unwrap();确保内容立即发送至MPV进程)
3. 验证MPV默认按键绑定有效性
若你的MPV配置修改过默认按键绑定,可添加--input-default-bindings参数恢复默认绑定,保证"p"对应暂停功能:
.arg("--input-default-bindings")
替代方案:使用IPC通信(更稳定)
如果stdin交互仍存在问题,推荐使用MPV的IPC套接字通信,这是更可靠的进程交互方式。示例代码片段:
// 启动MPV时指定IPC套接字路径 let mut output = Command::new("mpv") .arg(selected_song.unwrap()) .arg("--no-video") .arg("--input-ipc-server=/tmp/mpv.sock") .spawn() .expect("Failed to execute command"); // 通过Unix套接字发送暂停命令(依赖tokio库示例) use tokio::net::UnixStream; use tokio::io::AsyncWriteExt; async fn send_pause() -> Result<(), Box<dyn std::error::Error>> { let mut stream = UnixStream::connect("/tmp/mpv.sock").await?; stream.write_all(b"{\"command\":[\"set_property\",\"pause\",true]}\n").await?; Ok(()) }
内容的提问来源于stack exchange,提问作者framilano
相关产品推荐
相关产品推荐

