C#下载YouTube视频的音频

12

我可以从YouTube下载视频,但我只需要音频。我该怎么做?

我用VideoLibrary下载视频的代码:

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

你尝试过使用YoutubeExtractor吗?它可以提取音频文件。 - Jacobr365
为什么不直接下载整个视频,等下载完成后使用Graphedit提取音频wav文件呢? - Left panda
2
仅供参考,在YouTube的服务条款中:除非您在服务上看到“下载”或类似链接显示该内容,否则您不得下载任何内容。 - Steve
有一些ffmpeg的.NET库,你可能想尝试其中之一。 - Stefano d'Antonio
我已经创建了Youtuber,它是一个MP3下载器的完整源代码。https://itbackyard.com/youtuber/ - Maytham Fahmi
显示剩余2条评论
5个回答

32

安装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);
}

谢谢!非常顺利,唯一的缺点是你必须先下载原始文件,但我可以处理这个问题。 - Josh C
1
@JoshC 小技巧:如果你想要最好的音频,调用 GetVideos 并使用 OrderByDescending 按比特率排序。 - Stefano d'Antonio
2
只是想添加一条关于获取所有视频的注释。该方法被称为 GetAllVideos(string videoUri) - Ognjen Babic
1
请注意:还需要安装Nuget 'Install-Package VideoLibrary'。 - OverMars
1
我遇到了这个异常:-( 底层连接已关闭:无法建立 SSL/TLS 安全通道的信任关系。 - Vishal Parmar
显示剩余5条评论

5

上述代码很棒,您不需要先下载视频。我创建了这个过程,以便像我这样的新手更容易使用。

您需要安装nuget包MediaToolkitVideoLibrary

示例URL: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);
    }
}

@penguin。我得到了“在MediaFile中没有给定路径参数”的错误提示。 - user123456
@user123456 请确保设置了文件名属性。例如 MediaFile inFile = new MediaFile("文件路径"); 或者 MediaFile inFile = new MediaFile(){ Filename = "文件路径" };,两者是相同的。然后对于输出文件也做同样的操作。我猜测其中一个文件的文件名属性为空。请确保你设置的文件名不为空。 - Penguin
我通过使用MediaToolkit.Model修复了它。 - user123456
@Penguin,我可以下载这个文件吗? - user123456
@Penguin 在 Azure 中无法工作。 - user123456

3

基于这个主题,我开发了一个简单而傻瓜的程序来下载YouTube播放列表。希望这能帮助某些人。这只是一个Main.cs文件:Youtube播放列表下载器-Mp4和Mp3


1
我刚刚避免使用了ExtrairLinksPlaylist(conteudo); 所以我写了: var links = GetVideoURLS(conteudo); private static List GetVideoURLS(string conteudo) { var linksPlaylist = new List(); foreach(Match match in Regex.Matches(conteudo, "\"videoId\":\"([a-zA-Z0-9_]*)\",\"playlistId\"")) { linksPlaylist.Add("https://www.youtube.com/watch?v="+match.Groups[1].Value); } return linksPlaylist; } - John

2

好的,我找到了更好的方法,上面的代码没有对音频进行标准化处理,我会将它发布给其他人。首先添加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;
        }

1

我喜欢使用方法的想法。我尝试过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));

        }

`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接