如何阻止子进程的 stdin 并忽略其标准输出?



我试图使用使用mpv播放器的Rust构建YouTube流媒体。我设法从YouTube搜索页面中提取了音乐视频的URL。

我已经设置了一个输入循环来获取用户的命令。根据用户命令执行操作。当用户指定play thisSong时,音乐视频的URL被提取并保存为字符串。现在,我想通过调用mpv播放器来启动一个进程。mpv播放器的输出应该被忽略,播放器应该在后台播放音乐,用户应该回到提示,从那里他可以再次提供命令。

我尝试设置它,但问题是一旦mpv子进程启动,它就开始接受用户提供的命令到我的main程序中。我希望mpv忽略这些命令。

let mut youtube_mpv = match Command::new("mpv")
.arg(song_url)
.arg("--no-video")
.arg("--ytdl-format=worst")
.arg("--really-quiet")
.arg("&")
.stdout(Stdio::null())
.spawn()
{
Err(_why) => exit(1),
Ok(process) => process,
};
println!("Playing {} from YouTube", song_name);

添加.stdin(Stdio::null()).

默认情况下,子进程将从父进程继承所有流。如果您不希望这样做,请pipe它们(通过 stdin/stdout 与子进程交互)或null它们(重定向到/从/dev/null)。

顺便说一句,我不这么认为:

.arg("&")

说得通。它将向 mpv 传递一个&参数,mpv 将假定该文件,查找,无法找到并触发错误。假设您最终wait()mpv 子进程,它将始终报告失败。

最新更新