C# 下载 youtube 视频的声音

Posted

技术标签:

【中文标题】C# 下载 youtube 视频的声音【英文标题】:C# Download the sound of a youtube video 【发布时间】: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 在我开始之前我读过它。这只是为了增加经验和一个有趣的学校项目。不打算大量使用它。 【参考方案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));

        

`

【讨论】:

以上是关于C# 下载 youtube 视频的声音的主要内容,如果未能解决你的问题,请参考以下文章

如何仅流式传输来自 YouTube 的视频的声音? [关闭]

react-native-youtube 当手机处于静音模式时没有视频声音

Youtube 在 PWA 中播放带声音的视频不起作用

Youtube Player Iframe,在 Firefox 上没有视频的声音

使用 OpenCV 从 youtube 捕获实时视频

如何使用 C# 中的 Youtube API 将视频上传到 YouTube?