ASP ve FFMPEG ile Windows Serverlarda Video Convert

ASP ve FFMPEG ile Windows Serverlarda Video Convert

çok aramışsınızdır bir zamanlar youtube furyası vardı her önüne gelen video sitesi açmak için birbiriyle yarışıyordu o zamanlar php kullanan kullanıcılar aspcilere karşı çok daha fazla iş yapıyordu çünkü asp ile geliştirilmiş örnek bir kod bulunamamaktaydı herkes ffmpeg ile convert edileceğini biliyor fakat indirdikleri ffmpeg kopyalarından istedikleri sonucu elde edemiyorlardı.

İşte size arşivimden bulup çıkardığım ve istek üzerine de yayınlamak istediğim bir kod ve ffmpeg kopyası

Gerekli Olan FFMPEG Dosyaları

rar şifresi : www.erhankaraca.com

Gerekli DynuExec Componenti (Ücretsiz)

<%
 strFullFileName = "MYVIDEO.MPG"
 strFilename  = "MYVIDEO"
 strFileExt  = "MPG"
 Select Case UCASE(strFileExt)
  Case "MPG"�
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -ar 11025 -f flv -s 500x400 -y c:\" & strFilename & ".flv"
  Case "AVI"
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -ar 11025 -f flv -s 500x400 -y c:\" & strFilename & ".flv"
  Case "MOV"
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -ar 11025 -f flv -s 500x400 c:\" & strFilename & ".flv"
  Case "3GP"
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -ar 11025 -f flv -s 500x400 c:\" & strFilename & ".flv"
  Case "MP4"
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -ar 11025 -f flv -s 500x400 c:\" & strFilename & ".flv"
  Case "WMV"
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -f flv -s 500x400 c:\" & strFilename & ".flv"
  case else
   strCommand = "c:\bin\ffmpeg.exe -i c:\" & strFullFileName & " -s 500x400 c:\" &strFilename & ".flv"
 End Select
  �
    ' Küçük resim komutu buradaki 120 * 90 ı değiştirebilirsiniz
    strCommand2 = "c:\bin\ffmpeg.exe -i c:\" & strFilename & ".flv -s 120x90 -vframes 1 -f mjpeg c:\" & strFilename & ".jpg"
    ' Büyük resim komutu buradaki 500x400 ı değiştirebilirsiniz
 strCommand3 = "c:\bin\ffmpeg.exe -i c:\" & strFilename & ".flv -s 500x400 -vframes 1 -f mjpeg c:\b_" & strFilename & ".jpg"
 ' Bu Komut video süresini alabilmek için gerekli
 strCommand4 = "c:\bin\ffmpeg.exe -i c:\" & strFilename & ".flv"
�
 Set myexec = Server.Createobject("Dynu.Exec")
  myexec.execute(strCommand)
  myexec.execute(strCommand2)
  myexec.execute(strCommand3)
  strTemp=myexec.execute(strCommand4)
 Set myexec = nothing
 
 'Videonun Süresi Alınıyor
 strDuration=InStr(strTemp,"Duration: ")
 strLastDuration=Mid(strTemp,strDuration+10,8)
&>

35 Yorum »

  1. Erhan Karaca yine incilerini sizler için paylaşmış.Çoğu zaman kafasını şişirip kendisinden cok yardım istedim ve beni kırmamıştır.Yararlı paylaşımlarını ve deneyimlerini burda bu işe meraklı insanlarla paylaşması çok güzel.Ben onu asp dehası olarak görüyorum.Böyle şakır şakır bomboş sayfayı dolsuran bi adam daha önce görmedim çünkü:)

    comment-bottom
  2. Cüneyt Says:

    Bu kodları bir çok kişi belirli fiyat karşılığı veriyor. Bizimle böyle birşeyi paylaştığın için tşkür ediyoruz.

    comment-bottom
  3. Murat YETİŞ Says:

    Teşekkür ederim. Umarım çalıştırabilirim. sağolun.

    comment-bottom
  4. Erhan KARACA Says:

    eğer herhangi bir problemle karşılaşırsanız buraya yazın elimden geldiğince yardımcı olmaya çalışırım sonuçta buradaki sadece yapabilin diye bir örnek geliştirmek ve değiştirmek elinizde

    comment-bottom
  5. Selçuk Saygılı Says:

    onur üstat verdigin iki dosyayıda indirdim bu verdigin koduda kayit ettim bunlari nasil ne nerede kullanacagımı geniş olarak açıklaya bilirmisin.

    comment-bottom
  6. Erhan KARACA Says:

    dynu exec bir bileşen onu server a kur geri kalan ffmpeg exelerini tüm yetkilerin verildiği bir klasöre koy asp kodundan da ilgili pathleri düzelt yapman gereken başka birşey yok gerisi senin geliştirmene kalmış

    bu konu üzerine geniş bir döküman hazırlamak için şuanda vaktim yok ama geniş bir zamanda çok geniş bir yazı ile bu konuyu ele alacağım

    comment-bottom
  7. yuxell Says:

    bu komutları çalıştırdım, fakat internetteki server’a koymak istiyorum. dynu exec i host firmasından yüklemesini mi istemeliyim? host firması bunu yükler mi ayrıca?

    comment-bottom
  8. Erhan KARACA Says:

    hosting firmanla aranda olan anlaşmaya bağlı ama büyük bir ihtimalle izin vermeyebilirler hem execute hakkı verip hemde sistem kaynağının büyük bir bölümünü bu iş için harcamazlar bence senin ucuz yollu bir sanal sunucu ile bu işi çözmen gerekir

    comment-bottom
  9. yuxell Says:

    reseller bayisiyim bi host firmanın ama sanırım dediğiniz gibi izin vermezler.

    comment-bottom
  10. Erhan KARACA Says:

    bu tür 3. parti yazılımlar sistem için ciddi bir güvenlik zafiyeti doğurabiliyor o yüzden dediğim gibi vereceklerini sanmıyorum
    iyi çalışmalar

    comment-bottom
  11. merhaba erhan

    ffmpeg in sitesindede aradım ama adamlar çorba gibi yapmışlar siteyi. bir kaç deneme yaptım ffmeg sitesindeki dökümanlara bakıp ama elimdeki ffmpeg sürümü desteklemedi kodu.

    benim ricam şu. burada videonun en ve boyunu sabit vermişsin. ama malum her videonun en boy degeri aynı değil. video convert edince sünüyor.

    ffmpeg de hangi komut ile upload ettiğim videonun en ve boy degerini okuyabilirim.

    (senin ffmpeg sürümün ile )

    bu arada konu ile ilgili araştırma yaparken maxiasp de bişeyler gördüm. boşver çoluk cocukla ugraşma :))

    kolay gelsin.

    comment-bottom
  12. Erhan KARACA Says:

    Merhaba Harun,

    Öncelikle maxiasp konusunda düşüncelerine katılmıyorum herkesin kendine göre bildiği bilmediği şeyler vardır.

    Soruna gelirsek sanırım videonun mevcut resolutionunu almak istiyorsun bunun ne işine yarayacağını bilmiyorum ama aşağıdaki kod satırıyla işini görebilirsin

    ffmpeg -i [dosya_adi]

    yukarıdaki kod sana video dosyasının tüm infosunu verecektir. Kullanmak istediğin bölümü dönen sonucu parse ettirip alabilirsin.

    İyi çalışmalar dilerim

    comment-bottom
  13. Çözünürlüğüne değilde yükseklik ve genişliğine ihtiyacım var. mesela wide screen cekilmiş 16.9 bir videoyu en ve boy belirtmeden convert edersem ffmpeg kendisi 4.3 olarak default width ve height degerleri veriyor. orjinal videonun yüksekliğin ve genişligini bulursam
    ….11025 -f flv -s 500×400 -y c …
    buradaki 500 x 400 degerini olması gereken degerler ile değiştirebilirm diye düşündüm.

    dim orjen, orjboy
    orjen = ‘ ffmeg ten alınacak orjinal video genişliği
    orjboy = ‘ ffmpeg den alıacan orjinal video yuksekliği
    en = cint(orjen / 2) ‘ her ihtimale karşı tam sayı elde edebilmek için integer e cevirelim
    boy = cint(orjboy /2)

    … flv -s ” & orjen & “x” & orjboy & ” -y …….

    gibi bişeyler düşünüyorum.

    VB6 da bir converter yapmıştım. winmm.dll yi projeye import edip media dosyalarının her türlü bilgisini alabiliyordum ama bunu asp ye dökmek beni aştı :))

    ffmpeg te -i ile infoyu alabiliyorum ama iş bu info yu asp ye çekmeye gelince orada tıkandım. alabilsem bi şekilde ne bileyim split ile bölerim veya instr ile okur gerekli veriyi alırım ama gına geldi artık. vazgececegim nerdeyse. ilgilendişğin için teşekkürler.

    seni kodunda bunada örnek var . süreyi almışsın … strTemp,strDuration+10,8 … fakat kayma oluyor işte info okurken bir türlü denk getiremedim. bunun içinde ayrı bir -xxx gibi ffmpeg komutu varmı merak etmiştim.

    sana da kolay gelsin.

    comment-bottom
  14. Input #0, avi, from ‘testvideo.avi’:
    Duration: 01:36:42.6, start: 0.000000, bitrate: 1013 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 640×352, 25.00 fps(r)
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, 112 kb/s
    Must supply at least one output file

    C:\bin>

    instr ile Video: Satırından başlatarak okutuyorum ama mpeg4, yuv420p, satırları sıkıntı yapıyor çünkü bunların uzunlukarı değişiyor. kafa durmuş gece 3 ten beri. son anda sana mesaj yazarken aklıma geldi. bende dedim ki virüglleri split ile böyleyim :))
    böldüm ve sorunsuz çalıştı.

    kolay gelsin. görüşürüz.

    comment-bottom
  15. Erhan KARACA Says:

    başarılar kolay gelsin

    comment-bottom
  16. enginkaya Says:

    Merhaba,
    Kaynak için teşekkürler. Bir sorum olacak: FFMPEG ile video formatını değiştirmekten başka videoları kesme işlemi de yapabiliyor muyuz? Birkaç gündür ffmpeg ile ilgili kaynaklara bakıyorum fakat henüz ulaşabilmiş değilim.
    Örneğin: 60 dk.lık bir videoyu %100 olarak görürsek, 10′ar dakikalık parçalara ayırabilir miyiz?
    Teşekkürler.

    comment-bottom
  17. Erhan KARACA Says:

    Merhaba Engin,

    ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss 00:00:35 -t 00:00:30 out2.mpg

    şeklinde bir komut ile video bölme işlemini yapabilirsin

    comment-bottom
  18. enginkaya Says:

    Merhaba Erhan,
    Yanıtın için çok teşekkürler. Henüz o komutu deneme aşamasına gelemedim maalesef.

    İlk verdiğin kodları kullandıktan sonra (DynuExec’i direk install ettim) aşağıdaki uyarı kodunu aldım. Neden olabilir, neyi kurmamış olabilirim?

    Microsoft VBScript runtime error ‘800a01ad’

    ActiveX component can’t create object

    /praktikum/orta.asp, line 41

    comment-bottom
  19. Erhan KARACA Says:

    büyük olasılıkla yetki problemi olabilir dynu nun kurulduğu dizine gidip oradaki dll dosyalarında everyone‘a full erişim yetkisi vererek bir dene
    eğer olmaz ise o zaman iis üzerinden sitenin kullanıcı ayarlarını yapman gerekecek o zaman farklı birşeyler yapılıyor eğer olmazsa haberleşelim

    comment-bottom
  20. enginkaya Says:

    Merhaba,
    Henüz maalesef bir sonuç bulabilmiş değilim. Bilgisayarımda Visual Studio 2008 de yüklü. Sayfayı yeniledikten sonra, direk Debug seçeneği çıkıyor.
    41. Satıra denk gelen kısım: Set myexec = Server.Createobject(”Dynu.Exec”)

    Aynı zamanda gelen hata :
    An unhandled exception (’ActiveX component can’t create object’) occured in w3wp.exe [2164].

    Kullanıcıların ve Dynu dll dosyalarının hepsi yetkilenmiş durumda. Klasörlere de izin verdim.
    İşletim sistemi : Windows 7 Pro 64x.

    Gönderdiğin VB dosyasını kısa bir denedim, Convert butonuna tıkladıktan sonra, sunucu ile bağlantı kesildi uyarısı geliyor. .Net ayarlarını henüz yapmadım, ona da artık yarın bakacağım.

    Çok teşekkürler.

    Yardım için teşekkürler.

    comment-bottom
  21. enginkaya Says:

    Selam.
    Dynu ile problem vardı sanırım, sorunu Wshell ile çözebildim. Şimdi dosyayı convert edebiliyorum. Yardım için çok çok teşekkürler.

    Kullandığım kod :

    Set WScript = Server.CreateObject(”WScript.Shell”)
    Set oExec = WScript.Exec(”C:\inetpub\wwwroot\praktikum\bin\ffmpeg.exe -i c:\inetpub\wwwroot\praktikum\uploads\video\” & strFullFileName & ” -ar 11025 -f flv -s 500×400 -y c:\inetpub\wwwroot\praktikum\uploads\video\” & strFilename & “.flv”)
    Do While Not oExec.StdOut.AtEndOfStream
    Buf = oExec.StdOut.Read(1)
    If Buf = Chr(13) Then Buf = “” & Buf
    Loop

    Response.Write Buf

    comment-bottom
  22. enginkaya Says:

    bu arada o kodu baska bir sitede buldum. dynu ile benim gibi sorun yasayan olursa, yardimi olabilir.

    comment-bottom
  23. Harun Says:

    sunucuya format attım. formattan herşey normaldi. şimdi ne yaptıysam çalışmıyor.
    izinler yetkiler denemediğim şey kalmadı. ffmpeg.exe arkaplanda dahi açılmıyor.

    windows un cmd asp ile çalıştırmasına engel olan bişey olmalı. everyone izin bile verdim ama sonuç yok.

    response.write ile kodu ekrana alıyorum. yapıştırıyorum cmd ye şakış şakır çeviriyor. ama ne dynu ile , ne WScript.Shell ile çalışmadı .
    WScript.Shell ile WScript.run(xxx) şeklinde bile denedim ıı ıhhh.

    system32 içinde cmd ye bile full yetki verdim artık tak edince. yine olmadı. makineyi yeniden kurdum.

    özerilerinizi bekliyorum. başka bir ffmpeg versiyonu vs. veya benim sorunum tam olarak ne. tüm yetkileri verdiğim halde neden wshell işlem yapmaz ?

    comment-bottom
  24. Erhan KARACA Says:

    Harun,

    Öncelikle keşke o kadar uğraşmadan önce bana yazsaydın….
    Neyse wp-shell windows’un shell’ini kullanan bir kütüphanesidir. Dolayısıyla everyone vermenle izin vermiş sayılmazsn, iis de sitelere erişim yetkileri vardır. Bir siteyi taradığnda o servera hangi kullanıcıyla erişeceğinin bilgisi yazılır işte o ekranda (ki tam yeri iis de sitenin üzerine sağ tıkla özellikler > güvenlik şeklindedir) kullanıcı adı ve parola girmen lazım varsayılan olarak iis in anonim kullanıcısı vardır. O bölüme administrator grubundan bir kullanıcının bilgilerini girdiğinde (iis i restart etmen gerekir) artık windows un tüm yetkilerine sahip olacaksın (DİKKATTTTT: bu işlemi yaptığında sistemindeki ufak bir açıktan bile sunucuna girmeleri olasıdır. her işlemi yapabilir şifrelerini değiştirebilirler)

    dynu.exec i bu yüzden kullanmıştım component modelinde bu tür yetkiler varsayılan olarak komponente verilebiliyor.

    comment-bottom
  25. Harun Says:

    dynu da hiç çalıştıramamıştım. şimdi dynu kurunca bu izinler için yapmam gereken şey nedir ? dynu da dynu nun dll sine yetki verdim ama olmadı. aynışeyi iis dende dynu nundll sine vermiştim . yine olmamıştı. acaba bir windows güncellemesi bunu etkiliyor olabilir mi ?

    comment-bottom
  26. Harun Says:

    güvenlik açığı vermektense kullanmamayı yeglerim. cmd ye bulaşmak istemiyorum zaten. ama dynu da sonuç alamıyorum. componenti yukledim. program files te dll ye İİSUSR için okuma ve execute yetkisi verdim. ( makineni kendisine. her domain için ayrı ayrı vermek gerekmiyor sanırım.)
    sonuç aynı.

    comment-bottom
  27. Harun Says:

    Sorunum Tamamen izinler ilgili. Çünkü Localde çalıştırabiliyorum. Nereye ne izin vermemiz gerektiğini de detaylı olarak anlatabilir misin ?

    comment-bottom
  28. ibrahim bilgen Says:

    merhaba , herşey çalışıyor fakat çevirme işleminden sonra eski video dosyasıda serverda kalıyor. çevirme işleminden sonra ortaya çıkan yeni video dosyasını eskisinin üzerine yazması gibi birşey olabilir mi acaba ? yada başka bir yöntem ile eski dosyadan kurtulabilir miyiz ?

    comment-bottom
  29. Erhan KARACA Says:

    FSO ile eski dosyayı sildirebilirsiniz.


    < %
    dim fs
    Set fs=Server.CreateObject("Scripting.FileSystemObject")
    fs.CreateTextFile("c:\test.txt",True)
    if fs.FileExists("c:\test.txt") then
    fs.DeleteFile("c:\test.txt")
    end if
    set fs=nothing
    %>

    comment-bottom
  30. ibrahim bilgen Says:

    Peki teşekkürler.

    bu sorunun yanında burada vermiş olduğunuz ffmpeg dosyaları ile wmv ve flv dosyalarını flv ye convert işlemi başarısız oluyor. bunun için ne yapabiliriz ?

    comment-bottom
  31. Erhan KARACA Says:

    İbrahim Flv dosyalarını zaten çevirmene gerek yok onları olduğu gibi yükleyebilirsin.

    Wmv’ler ise zaten çevriliyor olması lazım, problem video dosyanda olabilir başka bir wmv dosyası ile deneyebilirsin eğer bundan çözüm alamazsan gerekli codecleri bulup ffmpeg in exesini tekrar compile etmen lazım ki bu inanılmaz zor bir iş belki ffmpeg in yeni bir sürümü olabilir onlara bakabilirsin. Aklıma başka bir sebep gelmiyor doğrusu.

    comment-bottom
  32. ibrahim bilgen Says:

    yanıtların için teşekkür ederim. .wmv leri denedim fakat codec sorunundan dolayı çevirmiyor. .flv lere gelince tekrar boyutlandırabilmem için ffmpeg ten geçirmem gerekiyor. bu nedenle convert etmeye çalışıyorum. iyi çalışmalar.

    comment-bottom
  33. enginkaya Says:

    Merhabalar yeniden,
    Yardıncı olabilirseniz c# ya da matematiksel bir sorum olacak. bir yerde takıldım.
    bir filmi otomatik olarak 2 ye bölme işlemini başardım, gayet güzel çalışıyor.
    ama 3 e bölme işlemini tam olarak çıkaramadım, şöyle ki:
    bir film düşünün : toplamda 15000 saniye
    bu filmi 3 parçaya ayıracağım.
    5000 saniye, 5000 saniye, 5000 saniye. bunu tabiki sonradan for (i=1 ; i < 4; i++) ile yapacagım.

    5000 saniyeyi saat hesabına çevirmem gerekiyor, kesme işlemi yapmak içn.

    bunu da yaptım.
    her bir parça 01:23:20 olmak zorunda.
    fakat, for(i=1 ; i <4; i++)
    dedigim zaman,
    i = 1 iken baslangıc 00:00:00 işlem süresi 01:23:20
    i = 2 iken baslangıc 01:23:20 işlem süresi 01:23:20
    i = 3 iken baslangıc 02:46:40 işlem süresi 01:23:20
    olmak zorunda;
    Burada i = 2 iken başlangıç süresini de yapabilirim ama i = 3 iken olan başlangıç süresini nasıl elde ederim? yeniden saniyeye çevirip toplama işlemi mi yapmak lazım?
    bi çözüm bulabilirseniz çok sevinirim bunu i = 10 a kadar tekrar ettirecegim
    bu arada saate çevirme işlemini de aynı ayrı buluyorum,
    toplam saniye yi 3600 a böl,

    zaman bulma işlemini saat, dakika ve saniye olarak ayrı ayrı toplam saniye üzerinden hesaplıyorum.
    yani saat = toplamsaniye / 3600
    dakikaX = toplamsaniye % 3600
    dakika = dakikaX / 60
    saniye = dakikaX % 60

    comment-bottom
  34. Erhan KARACA Says:

    Merhaba engin seni anladıysam eğer aşağıdaki gibi bir yöntem izleyebilirsin

    önce kendine saniye yollandığında geriye saat gönderen bir fonksiyon yaz sonra döngünün içerisindeki başlangıç ve bitiş sürelerini saniye cinsinden hesapla (her dönüm de saniyeler 1 ölçü artacak ya 0-5000,5000-10000,10000-15000)
    en son da bu saniye işlemlerini topladıktan sonra saniyeyi saate çeviren sonksiyon ile başlangıç ve bitiş sürelerini alabilirsin.

    comment-bottom
  35. enginkaya Says:

    Merhaba Erhan,
    Sorunu hallettimm. şimdilik sağlıklı çalışıyor. yanıtın için çok teşekkürler .

    Nasıl yaptım?
    Datetime BaslangicSaati = datetime.minvalue;
    Sonrasinda da standart arttırma zamanlarını BaslangicSaati = BaslangicSaati.AddHours(saat) …

    En sonunda, kesilmiş videoları birleştirmekk gerekiyor.
    FFMPEG ile video birleştirme işlemini yapamadım.FFMPEG dökümanında belirtilen kod: (Linux cat = Windows copy olarak belirtilmiş)

    copy movie1.avi movie2.avi movie3.avi > finalmovie.avi

    ama işlem sonunda aldığım mesaj;
    Unable to find …. for ‘copy’
    Nerede yanlış yapıyor olabilirim?

    comment-bottom

Bu yazıya yapılan yorumlar için RSS beslemeleri. Geri İzleme URL'si.

Yorum yapın