【问题标题】:C# Download the sound of a youtube videoC# 下载 youtube 视频的声音
【发布时间】:2017-02-14 03:06:56
【问题描述】:

我可以从 youtube 下载视频,但我只想要声音。我该怎么做?

我用于下载视频的代码(使用 VideoLibrary):

        YouTube youtube = YouTube.Default;
        Video vid = youtube.GetVideo(txt_youtubeurl.Text);
        System.IO.File.WriteAllBytes(source + vid.FullName, vid.GetBytes());

【问题讨论】:

  • 你试过 YoutubeExtractor 吗?它可以提取音频文件。
  • 为什么不直接下载整个视频,下载完成后使用 Graphedit 提取音频 wav 文件?
  • 仅供参考,在 youtube 的 TOS 上:“您不得下载任何内容,除非您看到 YouTube 在该内容的服务上显示“下载”或类似链接。”
  • ffmpeg .NET 库很少,您可能想尝试其中之一。
  • @Steve 在我开始之前我读过它。这只是为了增加经验和一个有趣的学校项目。不打算大量使用它。

标签: c# youtube mp3


【解决方案1】:

安装 NuGet 包:MediaToolkitVideoLibrary,它将允许您通过文件扩展名进行转换。

var source = @"<your destination folder>";
var youtube = YouTube.Default;
var vid = youtube.GetVideo("<video url>");
File.WriteAllBytes(source + vid.FullName, vid.GetBytes());

var inputFile = new MediaFile { Filename = source + vid.FullName };
var outputFile = new MediaFile { Filename = $"{source + vid.FullName}.mp3" };

using (var engine = new Engine())
{
    engine.GetMetadata(inputFile);

    engine.Convert(inputFile, outputFile);
}

【讨论】:

  • 谢谢!就像一个魅力,唯一的缺点是你必须先下载原始文件,但我可以处理。
  • @JoshC 是的,我刚刚在寻找另一个可以获取流并将其转换到内存中的库。如果我找到它,我会更新答案。
  • @JoshC 小技巧:如果您想要最好的音频,请调用GetVideos 并在比特率上使用OrderByDescending
  • 只是添加有关获取所有视频的注释。方法名为GetAllVideos(string videoUri)
  • 请注意:Nuget 'Install-Package VideoLibrary' 也是必需的。
【解决方案2】:

上面的代码非常棒,你不需要先下载视频我创建了这个程序,所以当像我这样的新手看到它时,它会更容易使用。 您需要 nuget 包 MediaToolkitVideoLibrary

示例网址:https://www.youtube.com/watch?v=lzm5llVmR2E 示例路径只需要一个保存文件的路径。 只需添加要保存的mp3文件的名称

希望这对我测试过这段代码的人有所帮助;

private void SaveMP3(string SaveToFolder, string VideoURL, string MP3Name)
{
    var source = @SaveToFolder;
    var youtube = YouTube.Default;
    var vid = youtube.GetVideo(VideoURL);
    File.WriteAllBytes(source + vid.FullName, vid.GetBytes());

    var inputFile = new MediaFile { Filename = source + vid.FullName };
    var outputFile = new MediaFile { Filename = $"{MP3Name}.mp3" };

    using (var engine = new Engine())
    {
        engine.GetMetadata(inputFile);

        engine.Convert(inputFile, outputFile);
    }
}

【讨论】:

    【解决方案3】:

    Ok 找到了一种更好的方法,上面的代码不会规范化发布给其他人的音频。 首先添加 Nuget 包:https://www.nuget.org/packages/NReco.VideoConverter/ 将 MP4 转换为 MP3

     // Client
            var client = new YoutubeClient();
            var videoId = NormalizeVideoId(txtFileURL.Text);
            var video = await client.GetVideoAsync(videoId);
            var streamInfoSet = await client.GetVideoMediaStreamInfosAsync(videoId);
            // Get the best muxed stream
            var streamInfo = streamInfoSet.Muxed.WithHighestVideoQuality();
            // Compose file name, based on metadata
            var fileExtension = streamInfo.Container.GetFileExtension();
            var fileName = $"{video.Title}.{fileExtension}";
            // Replace illegal characters in file name
            fileName = RemoveIllegalFileNameChars(fileName);
            tmrVideo.Enabled = true;
            // Download video
            txtMessages.Text = "Downloading Video please wait ... ";
    
            //using (var progress = new ProgressBar())
            await client.DownloadMediaStreamAsync(streamInfo, fileName);
    
            // Add Nuget package: https://www.nuget.org/packages/NReco.VideoConverter/ To Convert MP4 to MP3
            if (ckbAudioOnly.Checked)
            {
                var Convert = new NReco.VideoConverter.FFMpegConverter();
                String SaveMP3File = MP3FolderPath + fileName.Replace(".mp4", ".mp3");
                Convert.ConvertMedia(fileName, SaveMP3File, "mp3");
                //Delete the MP4 file after conversion
                File.Delete(fileName);
                LoadMP3Files();
                txtMessages.Text = "File Converted to MP3";
                tmrVideo.Enabled = false;
                txtMessages.BackColor = Color.White;
                if (ckbAutoPlay.Checked) { PlayFile(SaveMP3File); }
                return;
            }
    

    【讨论】:

      【解决方案4】:

      基于这个主题,我开发了一个简单而愚蠢的程序来下载 youtube 播放列表。希望这可以帮助某人。它只是一个 Main.cs 文件:Youtube Playlist Downloader - Mp4 & Mp3

      【讨论】:

      • 我只是避免使用 ExtrairLinksPlaylist(conteudo);所以我写道: var links = GetVideoURLS(conteudo); private static List GetVideoURLS(string conteudo) { var linksPlaylist = new List(); foreach(Regex.Matches 中的匹配匹配(conteudo,“\”videoId\“:\”([a-zA-Z0-9_]*)\“,\”playlistId\“”)){linksPlaylist.Add(“@ 987654322@); } 返回链接播放列表; }
      【解决方案5】:

      我喜欢使用方法的想法。我试过SaveMP3(),但它有一些问题。 这对我有用:`

       private void SaveMP3(string SaveToFolder, string VideoURL, string MP3Name)
              {
                  string source = SaveToFolder;
                  var youtube = YouTube.Default;
                  var vid = youtube.GetVideo(VideoURL);
                  string videopath = Path.Combine(source, vid.FullName);
                  File.WriteAllBytes(videopath, vid.GetBytes());
      
                  var inputFile = new MediaFile { Filename = Path.Combine(source, vid.FullName) };
                  var outputFile = new MediaFile { Filename = Path.Combine(source , $"{MP3Name}.mp3")  };
      
                  using (var engine = new Engine())
                  {
                      engine.GetMetadata(inputFile);
      
      
                      engine.Convert(inputFile, outputFile);
                  }
      
      
                  File.Delete(Path.Combine(source, vid.FullName));
      
              }
      

      `

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-20
        • 2022-08-19
        • 2011-06-08
        • 2017-10-22
        • 1970-01-01
        • 2018-08-19
        • 2014-04-29
        • 2010-11-08
        相关资源
        最近更新 更多