Merhabalar bugün sizlere değerli fayton pardon Python öğrencimiz @Ogehan 'nın geçmişte tasarladığı YouTube video indirme projesinin YoutubeExplode kütüphanesinden destek alarak C# versiyonunun nasıl yapıldığını göstereceğim. Valla yalan söylemeyeyim bazı yerlerde yardım almak durumunda kaldım çünkü kod bilgim yetersiz geldiği için. İnerken hem ses dosyası iniyor hem de video iniyor ancak videodan ses gelmiyor bunun için FFmpeg diye bir uygulama var, bu uygulama ses dosyaları ile videoyu birleştirmeye yarıyor. Biz de diğer konularımızda olduğu gibi argüman çalıştırma kodunu kullanarak komut verdirip harici inen iki dosyayı birleştiriyoruz. NuGet paket yöneticisinden YoutubeExplode kütüphanenizi projenize dahil etmeyi unutmayın.
Proje başına ekleyeceğimiz kütüphaneler
using System;using System.IO;using System.Linq;using System.Threading.Tasks;using YoutubeExplode;using YoutubeExplode.Videos.Streams;using YoutubeExplode.Exceptions;using System.Diagnostics;Burada indireceğimiz videoların piksel seçimi yapılıyor seçeneklerde 720 veya 1080 yoksa en yüksek değeri alıyor. Yukarıda dahil ettiğimiz kütüphaneler arasında bir ek kütüphane daha var dikkat ederseniz Exceptions bunu Try-Catch hata yakalama fonksiyonuna dahil ederek indirmek istediğiniz video kullanılamıyor veya silinmiş ise ekrana yazdırıyor. Diğer yaptığı bir işlem ise FFmpeg uygulamasının argümanını devreye sokarak çağırıyor.
C#:
static async Task DownloadVideoAsync(YoutubeClient youtube, string videoUrl)
{
try
{
var video = await youtube.Videos.GetAsync(videoUrl);
var streamManifest = await youtube.Videos.Streams.GetManifestAsync(video.Id);
var videoStreamInfo = streamManifest.GetVideoOnlyStreams()
.Where(s => s.VideoQuality.Label == "1080p" || s.VideoQuality.Label == "720p") // Video kaliteleri siz burayı değiştirebilirsiniz.
.OrderByDescending(s => s.VideoQuality)
.FirstOrDefault();
var audioStreamInfo = streamManifest.GetAudioOnlyStreams()
.GetWithHighestBitrate();
if (videoStreamInfo != null && audioStreamInfo != null)
{
var videoFileName = $"{SanitizeFileName(video.Title)}_{videoStreamInfo.VideoQuality.Label}_video.{videoStreamInfo.Container}";
var audioFileName = $"{SanitizeFileName(video.Title)}_audio.{audioStreamInfo.Container}";
var outputFileName = $"{SanitizeFileName(video.Title)}_{videoStreamInfo.VideoQuality.Label}.mp4";
Console.WriteLine($"Video indiriliyor: {outputFileName} ({videoStreamInfo.VideoQuality.Label})");
// Video ve ses akışlarını indir
await DownloadStreamAsync(youtube, videoStreamInfo, videoFileName);
await DownloadStreamAsync(youtube, audioStreamInfo, audioFileName);
// FFmpeg kullanarak video ve sesi birleştir
await FFmpegMerge(videoFileName, audioFileName, outputFileName);
// Geçici dosyaları temizle
File.Delete(videoFileName);
File.Delete(audioFileName);
Console.WriteLine("\nVideo başarıyla indirildi ve birleştirildi!");
}
else
{
Console.WriteLine("İstenen kalitede video akışı bulunamadı.");
}
}
catch (VideoUnavailableException)
{
Console.WriteLine("Bu video mevcut değil veya gizli.");
}
catch (VideoUnplayableException)
{
Console.WriteLine("Bu video oynatılamıyor veya kısıtlanmış.");
}
catch (YoutubeExplodeException ex)
{
Console.WriteLine($"YouTube API hatası: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Beklenmeyen bir hata oluştu: {ex.Message}");
}
}
Bu kodda ise sadece ses dosyası olarak indiriliyor.
C#:
static async Task DownloadStreamAsync(YoutubeClient youtube, IStreamInfo streamInfo, string fileName)
{
var progress = new Progress<double>(p => Console.Write($"\r{fileName} indiriliyor: {p:P2}"));
await youtube.Videos.Streams.DownloadAsync(streamInfo, fileName, progress);
Console.WriteLine();
}
Bu kodumuzda ise indirilen videonun adının içerisinde geçerli bir adı olup olmadığını kontrol etmek ve geçersiz karakterleri temizlemek için uygulamaya koyalım. Nedir bu karakterler işte bazıları;
\ / : * ? " < > | +
C#:
static string SanitizeFileName(string fileName)
{
return string.Join("_", fileName.Split(Path.GetInvalidFileNameChars()));
}
FFmpegmerge uygulamasını çalıştırmak için kullandığım argüman komutum
Kod:
static async Task FFmpegMerge(string videoFile, string audioFile, string outputFile)
{
// FFmpeg argüman komutunu
var ffmpegArgs = $"-i \"{videoFile}\" -i \"{audioFile}\" -c:v copy -c:a aac -strict experimental \"{outputFile}\"";
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg", // FFmpeg.exe ' sinin yolu
Arguments = ffmpegArgs,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
Console.WriteLine("FFmpeg ile video ve ses birleştiriliyor...");
process.Start();
string output = await process.StandardError.ReadToEndAsync();
process.WaitForExit();
if (process.ExitCode == 0)
{
Console.WriteLine(" " + "Birleştirme tamamlandı.");
}
else
{
Console.WriteLine($"Birleştirme sırasında bir hata oluştu:\n{output}");
}
}
Şimdi gelelim asıl indirme kodumuza ( Yukarıda yer alan kodları harekete geçirecek kısıma )
C#:
var youtube = new YoutubeClient();
while (true)
{
Console.Write("YouTube video URL'sini girin (Çıkmak için 'q' yazın): ");
var input = Console.ReadLine();
if (input.ToLower() == "q")
break;
await DownloadVideoAsync(youtube, input);
Console.WriteLine("\nBaşka bir video indirmek ister misiniz?");
}
Console.WriteLine("Program sonlandırılıyor...");
Şimdi Girdap Gülüm şarkısını YouTube üzerinden indirelim. İndirmeden önce video kalitesini 144p yapalım Memati'yi azıcık bulanıklaştıralım bakalım Memati bizim bilgisayara HD olarak gelmiş mi?
FFMpeg İndirmek İçin ; Release ffmpeg 7.0.2 builds · GyanD/codexffmpeg
~ S0N ~
Son düzenleme:





