#c# #.net #youtube
#c# #.net #YouTube
Вопрос:
Мне нужна помощь с кодом для загрузки видео с лучшим качеством видео 720p / 1080p, включая аудио, с использованием libvideo.Библиотека NET.
Я использовал getVideo в коде, но загруженное видео по умолчанию имеет разрешение «360p». Итак, я пробую это в коде (максимальное разрешение установлено как «1080p»).
var videoInfos = youTube.GetAllVideos(link);
var maxResolution = videoInfos.FirstOrDefault(v => v.Resolution == 1080);
Но как мне использовать GetAllVideos для сохранения видео с разрешением, которое я установил в коде.
Комментарии:
1. Используйте getVideo (maxResolution), чтобы получить выбранное разрешение, но будьте осторожны. Использование GetAllVideos приведет к извлечению всех доступных видео, но, похоже, те, которые имеют самое высокое разрешение, не включают аудио. Я сам пытаюсь найти решение этой проблемы для своего проекта.
Ответ №1:
Я решил это таким образом. Я загружаю видео с высоким разрешением. А затем загрузите видео со звуком, извлеките аудио с помощью MediaToolkit Nuget и соедините его с FFmpeg для тегов mp3, которые я использовал TagLibSharp
private async Task<string> Download(string Url, string Title, string Interpreter, bool AudioForVideo = false)
{
string audioPath = "";
try
{
YouTubeVideo video;
if (AudioForVideo || !cbDownloadVideo.Checked)
{
video = youtube.GetVideo(Url);
}
else
{
IEnumerable<YouTubeVideo> videos = youtube.GetAllVideos(Url);
video = videos.OrderByDescending(o => o.Resolution).ThenByDescending(o => o.Fps).First();
}
string fileName = video.FullName;
if (Title != "")
{
fileName = $"{Title}.mp4";
}
if (AudioForVideo)
{
fileName = fileName.Replace(".mp4", "_temp.mp4");
}
string videoPath = Path.Combine(Settings.Default.DownloadDirectory, fileName);
File.WriteAllBytes(videoPath, video.GetBytes());
if (!cbDownloadVideo.Checked || AudioForVideo)
{
audioPath = videoPath.Replace(".mp4", ".mp3");
MediaFile inputFile = new(videoPath);
MediaFile outputFile = new(audioPath);
using (Engine engine = new())
{
engine.GetMetadata(inputFile);
engine.Convert(inputFile, outputFile);
}
File.Delete(videoPath);
if (!AudioForVideo)
{
TagLib.File mFile = TagLib.File.Create(audioPath);
mFile.Tag.Title = fileName.Replace(".mp4", "");
mFile.Tag.Artists = new string[] { Interpreter };
mFile.Save();
}
}
else
{
if (video.AudioFormat == AudioFormat.Unknown)
{
string audioInputPath = await Download(Url, Title, Interpreter, true);
string tempVideoPath = videoPath.Replace(".mp4", "_output.mp4");
FFMpeg.ReplaceAudio(videoPath, audioInputPath, videoPath.Replace(".mp4", "_output.mp4"));
File.Delete(videoPath);
File.Move(tempVideoPath, videoPath);
File.Delete(audioInputPath);
}
}
exception = "";
}
catch (Exception ex)
{
exception = ex.Message;
}
return audioPath;
}