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.
//DOSYA IMAGE ÇIKARILIR
Process 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 belirtilir
string 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ır
create_thumbnail = new Process();
//aşağıdaki arguman ifade de hangi ölçülerde görüntü alınacağı belirtilir
create_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("~\\ffmpeg\\ffmpeg.exe");
create_thumbnail.Start();
//SIRADA CONVERT İŞLEMİ VAR
Process convert_file; // creating process
string 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 belirtilir
convert_file.StartInfo.Arguments = " -i \"" + video + "\" -ar 11025 -f flv -s 402x338 \"" + flv + "\""; // arguments !
//ffmpeg dosyası çalıştırılı ve convert işlemi başlar
convert_file.StartInfo.FileName = HttpContext.Current.Server.MapPath("~\\ffmpeg\\ffmpeg.exe");
convert_file.Start(); // start !
//TÜM İŞLEMLER BİTTİ
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.
<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"/>
Konuyla ilgili karşılaşacağınız sorunları mesaj olarak yazabilirsiniz. İyi çalışmalar dilerim
3 Eylül 2009 Perşembe 0:26
Mesajınızı yazabilirsiniz
Mesajlar
resooul
8 Eylül 2009 Salı sabah 10:18
Çok güzel bir çalışma olmuş, ellerine sağlık.
ramazan
8 Aralık 2009 Salı akşam 19:53
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.
zaliym
14 Aralık 2009 Pazartesi sabah 9:38
Hocam daha yüksek bi dosya upload etmek için nasıl bir yol izleyebiliriz.
İyi çalışmalar kolay gelsin.
Emre KIYAK
14 Aralık 2009 Pazartesi sabah 9:46
Makalenin sonunda verdiğim ayarlamalardan yapacaksınız. Web.Configden. maxRequestLength="32768" mesela bu 32. MB'lık bi dosyaya işarettir ama ben başarılı olamadım 27MB'a kadar upload ettim. Denemek gerekiyor.
Beyazgolge
9 Haziran 2010 Çarşamba akşam 22:28
Hocam Merhabalar
Bu convert işlemi biraz uzun sürüyor yani kullanıcının bekleme sınırında değil oyüzden işlem esnasında sistemi durdup işlemin bitmesini bekletebilirmiz.
Thread.Sleep(20000); ben bununla biraz uğraştım ama herzaman bu kadar uzun sürmüyor işlemin süresini nasıl alabilriz.
Emre Kıyak
11 Haziran 2010 Cuma 0:9
Thread.sleep metodu pek uygun değil bence. Üst düzey video paylaşım sitelerinde bile dosya upload süresi var. Bir bekleme mutlaka oluyor. ffmpeg'de de arka planda bir convert işlemi oluyor. Önce video fiziksel dosya olarak upload oluyor ardından uygun formata convert işlemi gerçekleşiyor. Bu süre içinde loading gif kullanmak bence yeterli. Tabi bi müşteriye hizmet veriyorsanız ya da bi patronunuza iş yetiştirecekseniz talepler değişebilir :)
Beyazgolge
16 Haziran 2010 Çarşamba akşam 20:2
Hocam Merhabalar Yine ben:
localde herşey normal ve süper çalışıyor ana canlıda şölebir hata alıyorum.
bu hata sayfası.
Access is denied
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ComponentModel.Win32Exception: Access is denied
Source Error:
Line 81: create_thumbnail.StartInfo.Arguments = " -i \"" + video + "\" -s 402*338 -vframes 1 -f image2 -vcodec mjpeg \"" + resim1 + "\"";
Line 82: create_thumbnail.StartInfo.FileName = HttpContext.Current.Server.MapPath("\\ffmpeg\\ffmpeg.exe");
Line 83: create_thumbnail.Start();
Line 84: Process convert_file;
Line 85: string flv = Server.MapPath("~\\media\\video\\" + dosya + ".flv");
hata bu hocam:
Bunun için hosting den izin vermek mi lazım hocam bilmiyorum.
Emre Kıyak
17 Haziran 2010 Perşembe 0:14
yazma izinlerini kontrol et.
Beyazgolge
17 Haziran 2010 Perşembe sabah 9:25
ffmpeg.exe in bulunduğu klasörümi yoksa videonun kayıt olacağı klasörünmü yazma iznini. ben çünkü videonun kayıtolduğu klasöre izin verdim.
Emre Kıyak
17 Haziran 2010 Perşembe öğleden sonra 16:48
.exe'nin bulunduğu klasöre de yazma izni vereceksin. daha doğrusu erişim izni vermen gerekir.
Beyazgolge
18 Haziran 2010 Cuma sabah 10:22
Teşekkürler Hocam bilgiler için Sorunlarımı hallettim.
burak
21 Haziran 2010 Pazartesi akşam 22:12
hocam peki bu upload ettiğimiz videoyu sayfada oynatmamız hakkında bi fikrin varmıdır ve bu convert işleminden sonra hangi dosyayı upload ediyoruz onu tam anlamadım
convert_file.Start() dedikten sonramı upload edecem nası olcak ve hangi dosyayı upload edecem?
Emre KIYAK
22 Haziran 2010 Salı 0:18
tabi ki bi fikrim var da senin hiç bi fikrin yoksa bu konuda dosya convert etme ile ne işin var onu merak ettim. dosya convert etmek ile ilgilenmeden önce bi dosyayı playerda çalıştırabilme yetisine daha önce sahip olmak gerekmez mi ? convert işleminden sonra da dosya upload edilmiyor zaten. sen bi dosyayı upload ediyorsun o da ilgili formata dönüştürüyo. dönüştürdükten sonra o videonun hangi pathte olduğunu artık sen bileceksin ve çalıştıracaksın dosyanı. gayet açık yazıyor her şey.
Ersen
16 Ağustos 2010 Pazartesi sabah 10:13
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ü?
Emre Kıyak
16 Ağustos 2010 Pazartesi akşam 21:16
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.
Ersen
19 Ağustos 2010 Perşembe sabah 10:11
Teşekkürler Emre bey. Hakan bey e de teşekkürlerimi iletmenizi rica ediyorum. İstediğim gibi, istediğim sürede capture alabiliyorum artık. Yalnız bir problem daha var. Dosyayı upload ettikten hemen sonra capture yapmak durumundayım. Capture et diye bir buton koymak istemiyorum (en azından şimdilik). Aşağıdaki kod ile hem upload hem capture yapıyorum, ancak video eksik ve çözünürlüğü bozuk bir şekilde upload edilmiş oluyor.
FileUpload1.PostedFile.SaveAs(Server.MapPath(inputPath + "/" + fileName));
VideoCapture("v" + Session["uyelikID"].ToString() + "a" + siraID, sureText);
Emre Kıyak
19 Ağustos 2010 Perşembe öğleden sonra 14:32
Sanırım büyük boyutlu bi video upload edeceğiniz zaman yaşıyorsunuz bu problemi. Bu konuda projeyi sanırım incelemek gerekir. Fazla bir şey söyleyemeyeceğim.