【问题标题】:Download YouTube video in c# and discord.net用 c# 和 discord.net 下载 YouTube 视频
【发布时间】:2018-08-19 16:34:35
【问题描述】:

我正在创建一个不和谐的机器人,它应该能够播放来自 youtube 的音乐。我已经创建了播放音乐的代码,但我仍然需要下载音乐。当我下载它时,我得到这个输出:

Downloading (VIDEO NAME) - YouTube.mp4 to C:\Users\Laurin\source\repos\DiscordBot\DiscordBot\bin\Release\netcoreapp2.0\win10-x64
Downloaded. Saving to disk
16:46:15 Gateway     A MessageReceived handler is blocking the gateway task.

我当前的代码:

[Command("yt")]
    public async Task ytCommand([Remainder] string url)
    {
        SaveVideoToDisk(url);
    }

    void SaveVideoToDisk(string link)
    {
        var youTube = YouTube.Default; // starting point for YouTube actions
        var video = youTube.GetVideo(link); // gets a Video object with info about the video
        Console.WriteLine("Downloading " + video.FullName + " to " + Directory.GetCurrentDirectory());
        byte[] bytes = video.GetBytes();
        Console.WriteLine("Downloaded. Saving to disk");
        File.WriteAllBytes(Directory.GetCurrentDirectory() + video.FullName, bytes);
    }

我正在使用libvideo/VideoLibrary 下载视频

【问题讨论】:

  • 为什么这个问题被否决了?
  • @Unknown 我也不知道
  • 我没有投反对票,但我怀疑这与您没有提出问题有关,因此您在这篇文章上浪费了大家的时间,因为没有办法回答它。 Stack Overflow 不是一个讨论论坛,它是一个问答网站,您可以在其中提出可以回答而不是讨论的特定编程问题。请阅读How do I ask a good question?What topics can I ask about here?,然后编辑您的问题以符合网站指南。

标签: c# .net console-application discord.net


【解决方案1】:

请求和下载视频需要异步运行,以免阻塞网关处理程序。

https://docs.microsoft.com/en-us/dotnet/csharp/async

https://blog.stephencleary.com/2012/02/async-and-await.html

【讨论】:

    【解决方案2】:

    您必须将命令运行模式设置为异步,这样它就不会阻止任何事情:

    [Command("yt", RunMode = RunMode.Async)]

    【讨论】:

    • 谢谢,我是不和谐机器人编程的新手,所以我不知道
    • 现在我有了这个:Downloading (VIDEO NAME) - YouTube.mp4 to C:\Users\Laurin\Source\Repos\LaneBot\LaneBot\bin\Release\netcoreapp2.0\win10-x64 06:25:39 Gateway System.Exception: Server missed last heartbeat at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Discord.ConnectionManager.<>c__DisplayClass28_0.<<StartAsync>b__0>d.MoveNext() 06:25:39 Gateway Disconnecting 你知道 II 可以如何解决吗?
    • 我建议你打开另一个问题,或者加入discord api服务器:discord.gg/discord-api并在#dotnet_discord-net频道提问。
    【解决方案3】:

    您可以使用Youtube Explode来代替下载视频,来获取Stream对象并将流通过管道传输到ffmpeg中。

    编辑:System.Diagnostics.process 不适合管道所以我使用Cliwrap

    从 youtube 视频中获取流的代码

    YoutubeClient youtube = new YoutubeClient()
    var StreamManifest = await youtube.Videos.GetManifestAsync()
    var StreamInfo = await StreamManifest.GetAudioOnly().WithHighestBitrate();
    var stream = youtube.Videos.Streams.GetAsync(StreamInfo)
    

    允许管道到标准输入并获取标准输出的代码。

    var memoryStream = new MemoryStream();
            await Cli.Wrap("ffmpeg")
                .WithArguments(" -hide_banner -loglevel panic -i pipe:0 -ac 2 -f s16le -ar 48000 pipe:1")
                .WithStandardInputPipe(PipeSource.FromStream(strean))
                .WithStandardOutputPipe(PipeTarget.ToStream(memoryStream))
                .ExecuteAsync();
    

    播放不和谐的记忆流!

    using (var discord = AudioClient.CreatePCMStream(AudioApplication.Mixed))
            {
                try {await AudioClient.WriteAsync(memoryStream.ToArray(), 0, (int)memoryStream.Length); }
                finally { await AudioClient.FlushAsync(); }
            }
    

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2017-10-22
      • 2017-02-14
      • 1970-01-01
      • 2010-11-08
      • 2011-04-30
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多