我试图使用使用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 子进程,它将始终报告失败。