You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:20:17