我正在尝试让我的Discord机器人使用youtube-dl中的视频网址(音频网址)作为ffmpeg路径/源来播放任何youtube视频中的音频。我知道它可以正常工作,但是在测试时,ffmpeg在音频中间抛出错误,并且过程结束。这是错误: https://i.imgur.com/uCy8SfK.png
我尝试通过下载并使用该文件的路径作为ffmpeg源路径来播放相同的歌曲,并且效果很好。
这是我启动ffmpeg程序的方式:
return Process.Start(new ProcessStartInfo
{
FileName = "ffmpeg.exe",
Arguments = $"-xerror -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1",
UseShellExecute = false,
RedirectStandardOutput = true
});
{path}是youtube-dl进程的音频网址。 (也可以在错误屏幕截图中看到该网址)
这是我从youtube-dl获取链接的方式:
Process youtubedl;
ProcessStartInfo youtubedlGetTitle = new ProcessStartInfo()
{
FileName = "youtube-dl",
Arguments = $"--get-title --get-duration --get-url {url}",
CreateNoWindow = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
youtubedl = Process.Start(youtubedlGetTitle);
youtubedl.WaitForExit();
{url}是正常的youtube视频链接。
我刚开始使用ffmpeg和youtube-dl,所以可能有一些我不知道的愚蠢的菜鸟错误。对于我做错了任何指导和/或解释,我将不胜感激。
答案 0 :(得分:1)
您可以将youtube-dl
的输出直接传递到ffmpeg
中,这样,它们就可以作为父进程的一部分一起执行。
不能100%地确定这可以解决您的问题,但是值得一试。
下面是在Windows中执行此操作的代码示例:
// Note that 'query' can be both a youtube video URL or a search term (ex: "africa by toto")
private Process CreateStream(string query)
{
return Process.Start(new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/C youtube-dl.exe --default-search ytsearch -o - \"{query}\" | ffmpeg -i pipe:0 -ac 2 -f s16le -ar 48000 pipe:1",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
);
}