如何将youtube视频的音频URL作为ffmpeg源传递

时间:2019-08-02 15:05:13

标签: c# ffmpeg youtube-dl discord.net

我正在尝试让我的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,所以可能有一些我不知道的愚蠢的菜鸟错误。对于我做错了任何指导和/或解释,我将不胜感激。

1 个答案:

答案 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
        }
    );
}