FFMPEG ile Asp.Net'te on the fly herhangi bir video formatını flv'ye dönüştürmek
Bu konu hakkında yazı yazmayı düşünürken, başka bir konu hakkında tesadüfen araştırma yapıyorudum. Emre Kıyak sağolsun ilgili yazıyı yazmış. Ben sadece yazıyı kendi bloguma kopyalayıp, uygun bulduğum yorumlarıda dahil ettim.
ASP.NET'te FLV convert işlemi, FFMPEG kurulumu
Son çalıştığım projede kullanıcıların siteye video upload etmeleri söz konusuydu. Bu durumda upload edilen videoların flv dosya türüne de çevrilmesi gerekliydi. Bunun için nette yaptığım bütün araştırmalarda karşıma tek bir convert projesi çıkıyordu : FFMPEG. FFMPEG projesi ses ve video dosyalarının çok geniş dosya türünde birbirine dönüştürülmesine imkan vermektedir. Kaynak kodlarını indirip açtığınızda C ve C++ da hazırlanmış bir dünya dosya ile karşılaşacaksınız. Bunlar şu an işimize yaramıyor. Bize API gibi bir kullanım kılavuzu gerekli. FFMPEG'in kendi sitesinde böyle bir kaynağa ulaşamadım. ASP.NET'te FFMPEG kullanımının anlatıldığı makalelerde ffmpeg.exe ve bir dizi .dll dosyalarının kullanıldığını görüyoruz. Bunları topluca anca o makale kaynaklarında bulabiliyoruz. Ben bu dosyaları bir paket yapıp burada size sunuyorum. İndireceğiniz dosyaları proje ana dizininde bir klasöre kopyalayın. Bir de yüklenecek videolar ve videonun içinden çekilecek olan capture görüntüsü için klasörlerinizi belirleyin.
Video dosyası upload edilirken gerekli uzantı ve dosya boyutu kontrollerinizi yaptıktan sonra sıra dosyanın upload edilmesi işlemine geliyor. Burası zaten bildiğiniz dosya upload işlemidir. Video upload ve bunun convert edilmesi konusu ile uğraşanların fileupload kontrolünü kullandığını varsayıyorum.
Video dosyasını video/temp gibi bir klasöre yükleyelim. Ardından ilk işimiz bu video dosyası içinden bir capture görüntü almak olsun.
Yukarıdaki kodları satır satır incelerseniz ve açıklamaları okursanız convert işlemi için nelerin yapıldığını çok rahatlıkla anlarsınız. Burada şunu belirtmek gerekir : Projeyi sunucuya gönderdiğinizde ffmpeg.exe ve dll dosyalarının bulunduğu klasör ile video dosyasının upload edileceği ve imajın kaydedileceği klasörlere yazma izni vermelisiniz.
Son olarak da web.config dosyasında ayarlamalarımızı yapmamız gerekecek. MaxRequestLength ifadesi upload edilecek dosyanın boyutunun maksimum sınırını belirler. Bununla ilgili yaptığım denemede 28MB'dan büyük dosyaları upload edemediğimi de eklemek isterim.
enableKernelOutputCache
<httpRuntimeexecutionTimeout="110"maxRequestLength="32768"requestLengthDiskThreshold="80"useFullyQualifiedRedirectUrl="false"minFreeThreads="8"minLocalRequestFreeThreads="4"appRequestQueueLimit="5000"enableKernelOutputCache="true"enableVersionHeader="true"requireRootedSaveAsPath="true"enable="true"shutdownTimeout="90"delayNotificationTimeout="5"waitChangeNotification="0"maxWaitChangeNotification="0"enableHeaderChecking="true"sendCacheControlHeader="true"apartmentThreading="false"/>
//DOSYA IMAGE ÇIKARILIRProcess create_thumbnail;//video değişkeninde upload edilen videonun dosya yolu tutulur//resim değişkeninde de video içinden alınacak capture görüntünün kaydedileceği yol belirtilirstring video = Server.MapPath("medya/video/temp/" + upload_edilen_dosya_adi + video_uzanti);string resim = Server.MapPath("medya/video/img/" + upload_edilen_dosya_adi + ".jpg");//process işlemi başlatılırcreate_thumbnail = new Process();//aşağıdaki arguman ifade de hangi ölçülerde görüntü alınacağı belirtilircreate_thumbnail.StartInfo.Arguments = " -i "" + video + "" -s 402*338 -vframes 1 -f image2 -vcodec mjpeg "" + resim + """;//ffmeg.exe dosyası çalıştırılır ve işlem gerçekleşir.create_thumbnail.StartInfo.FileName = HttpContext.Current.Server.MapPath("~ffmpegffmpeg.exe");create_thumbnail.Start();//SIRADA CONVERT İŞLEMİ VARProcess convert_file; // creating processstring flv = Server.MapPath("medya/video/" + upload_edilen_dosya_adi + ".flv");convert_file = new Process();//convert edilecek video dosyası daha önceden upload edilmişti.//dosyanın hangi boyutlarda olacağı burada belirtilirconvert_file.StartInfo.Arguments = " -i "" + video + "" -ar 11025 -f flv -s 402x338 "" + flv + """; // arguments !//ffmpeg dosyası çalıştırılı ve convert işlemi başlarconvert_file.StartInfo.FileName = HttpContext.Current.Server.MapPath("~ffmpegffmpeg.exe");convert_file.Start(); // start !//TÜM İŞLEMLER BİTTİ
upload_edilen_dosya_adi ni nasil alabilirim. yani işlemi yapıyor ama
örneğin deneme.avi dosyasını çevirdiğim zaman deneme.avi.flv yapıyor
Emre KIYAK
9 Aralık 2009 Çarşamba öğleden sonra 12:7
Merhaba ramazan, ASP.NET'te dosya upload konusunu hızlıca bir araştırmanı tavsiye ediyorum öncelikle. Upload edilen dosyanın adını FileUpload1.Filename şeklinde alabilirsin. Upload edilen dosyanın uzantısını da System.IO namespaceini dahil ettikten sonra (using System.IO) Path.GetExtension(FileUpload1.FileName.ToLower()); şeklinde alabilirsin. Buna göre video convert işleminde de dosya adını ve uzantısını yönetebilirsin. Yani önce upload edilen dosya ile ilgili bilgileri değişkenlerde tut. O kısmı makaleye dahil etmedim. Dosya upload konusuna önce bir göz at. Sonra tekrar bu konuya dönmeni tavsiye ederim.
Allah razı olsun, çok işime yaradı paylaşımın. Yalnız bir isteğim var. Video dan aldığımız capture, ilk frame den alınıyor. Hangi frame den veya süre den capture almak istediğimizi belirtebilmemiz mümkün mü?
Bu konuyu ffmpeg konusunu ilk öğrendiğim kişiye Hakan Aksan'a sordum. Kodlarda imageı aldığımız yerde -s 402*338 -vframes 1 -f kodu ile ilk framei alıyoruz. Ekleyeceğimiz bir parametre ile de dilediğimiz saniyeden capture alabiliyoruz. O da şu : -s 120x90 -ss 00:00:15 -vframes 20 Bu kod ile 15. saniyenin 20. karesini alıyoruz. Bu noktada Hakan Aksan'ın bir uyarısı var. "toplam kaç saniye oldugunu öğrenip karşılaştırma yapıp yarısını alsak daha sağlıklı olur" diyor. Bu da önemli bir nokta. Kolay gelsin.
Emre Kıyak
16 Ağustos 2010 Pazartesi akşam 21:16
Ersen
16 Ağustos 2010 Pazartesi sabah 10:13
16 Ağustos 2010 Pazartesi sabah 10:13
ErsenRead more at www.emrekiyak.com
Yorumlar
Yorum Gönder