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.

Amplify’d from www.emrekiyak.com


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 Ç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("~ffmpegffmpeg.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("~ffmpegffmpeg.exe");

                    convert_file.Start(); // start !

 

                    //TÜM İŞLEMLER BİTTİ


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.

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
Ersen
Read more at www.emrekiyak.com
 

Yorumlar

Bu blogdaki popüler yayınlar

22.06.2020 - 26.06.2020 arası işler

Asp.net RestSharp ile data post etmek

List Box Item içindeki elemanları aşağı veya yukarı taşımak