我可以从YouTube下载视频,但我只需要音频。我该怎么做?
我用VideoLibrary下载视频的代码:
YouTube youtube = YouTube.Default;
Video vid = youtube.GetVideo(txt_youtubeurl.Text);
System.IO.File.WriteAllBytes(source + vid.FullName, vid.GetBytes());
我可以从YouTube下载视频,但我只需要音频。我该怎么做?
我用VideoLibrary下载视频的代码:
YouTube youtube = YouTube.Default;
Video vid = youtube.GetVideo(txt_youtubeurl.Text);
System.IO.File.WriteAllBytes(source + vid.FullName, vid.GetBytes());
安装NuGet包:MediaToolkit
和VideoLibrary
,这将允许您根据文件扩展名进行转换。
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);
}
GetVideos
并使用 OrderByDescending
按比特率排序。 - Stefano d'AntonioGetAllVideos(string videoUri)
。 - Ognjen Babic上述代码很棒,您不需要先下载视频。我创建了这个过程,以便像我这样的新手更容易使用。
您需要安装nuget包MediaToolkit
和VideoLibrary
。
示例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);
}
}
MediaFile inFile = new MediaFile("文件路径");
或者 MediaFile inFile = new MediaFile(){ Filename = "文件路径" };
,两者是相同的。然后对于输出文件也做同样的操作。我猜测其中一个文件的文件名属性为空。请确保你设置的文件名不为空。 - Penguin基于这个主题,我开发了一个简单而傻瓜的程序来下载YouTube播放列表。希望这能帮助某些人。这只是一个Main.cs文件:Youtube播放列表下载器-Mp4和Mp3
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好的,我找到了更好的方法,上面的代码没有对音频进行标准化处理,我会将它发布给其他人。首先添加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;
}
我喜欢使用方法的想法。我尝试过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));
}
`