2009-12-02 21 views
11

Biraz arka plan, birkaç "küçük" hata tespit ve uygulamanın iki örneği arasında ağ üzerinden video akışı için bu çözümü sürdürmenin görevi verildi. Çözüm artık burada olmayan bir kişi tarafından yazılmıştır, bu yüzden kodda bazı gizemler ve bazı eğlenceli tuzaklar vardır. Çözüm, kodlama/kod çözme ile ilgili kodun yanı sıra bazı akış kodlarının sarılması için C++ kodu ile ffmpeg kullanılarak yazılmıştır. Bu C++ daha sonra SWIG ile sarılmıştır, böylece C# ile birlikte çalışabilir ve bir WPF kontrolünde yaşayan VideoRendererElement kullanarak video çerçevelerini geçirir. Çerçevelerin aktarılmasının temel nedeni, video verilerini göndermemiz gereken bazı özel protokollerimiz ve C# kullanılarak yazılan video protokolleri sayesinde kendi paketlerimize sarmak ve kabloya göndermek . Bu çözüm işe yarıyor ve özel protokollerimizi kullanarak video akışı sağlayabiliyor, ancak bu, sürdürmek ve çalışmak için bir kabusun bir parçası.C# kullanarak video nasıl kodlanır/çözülür?

Soruma göre bunun daha iyi bir yolu var mı? Video kareleriyle (C#) daha düşük bir seviyede çalışmanın yollarını arıyorum, böylece video karelerini alıp kendi paketlerimizde paketleyip gönderebileyim ve videoyu alıp yeniden oluşturabilirim. diğer taraf. ffmpeg ortak bir çözüm gibi görünüyor ama ben onunla bir sürü sorunla karşılaştım ve bir sorun olduğunu düşündüğüm GPL/LGPL şey.

Temel akışını elde etmek istiyorum, video dosyası -> kodlamak -> paketin içinde sarın -> protokolü X'e aktar -> paketinden video verilerini alın -> decode -> diske oluştur/kaydet

+0

LGPL neden sizin için bir problemdir? Uygulamanız ticari müşteriler için olsa bile, bir sorun olmamalıdır. –

+0

Olası Çoğalt: http://stackoverflow.com/questions/271003/anyone-know-of-a-set-of-c-bindings-for-ffmpeg –

+0

GPL/LGPL şey başka bir işçi tarafından yetiştirildim ama ffmpeg'i ve bazı bağımlı kütüphanelerini nasıl kullandığımızla ilgili lisansı bozacağımıza benziyorlardı. Mükerrer postaya gelince mümkünse ffmpeg'den uzaklaşmaya çalışıyorum ve keskin ffmpeg çalışmış gibi görünmüyor ya da artık destekleniyordu. –

cevap

0

Bakmaya çalıştığınız şey SharpFFmpeg. GPL'yi kullanarak lisanslıdır, ancak sarıcılarını nasıl yazdıklarını görebilmeniz mümkün olabilir ve kendi çözümünüzü yazabilir veya mevcut çözümünüzü nasıl düzelteceğiniz hakkında fikir edinebilirsiniz.

Düzenleme:

bir LGPL kullanan ffmpeg-sharp üzerinde code.google.com de denilen benzer bir sarıcı, var - belki ticari uygulamalarda kullanabilirsiniz. SharpFFmpeg yaşça büyük ve muhtemelen daha olgun olmasına rağmen, bu sarmalayıcıların ikisi de aynı şeyi yaptığından şüpheleniyorum.

2

Bir DLL içine sarılmış ffmpeg kullanarak her türlü sorun vardı. Video projem oldukça basitti - Dönüştürücüye WMV'den tek bir küçük resim çekmek için ihtiyacım vardı.

Tanımladığınız şeyi denedikten sonra, çözümüm ffmpeg.exe ikili dosyasını projeme harici bir kitaplık olarak kopyalamaktı. Bu da düzgünce

 Guid temp = Guid.NewGuid(); 

     // just throw our ffmpeg commands at cmd.exe 
     System.Diagnostics.ProcessStartInfo psi = 
      new System.Diagnostics.ProcessStartInfo("cmd.exe"); 

     psi.WorkingDirectory = Page.MapPath(@"~\Lib\ffmpeg.rev12665"); 

     psi.UseShellExecute = false; 
     psi.RedirectStandardError = true; 
     psi.RedirectStandardOutput = true; 
     psi.RedirectStandardInput = true; 

     System.Diagnostics.Process ps = System.Diagnostics.Process.Start(psi); 

     StreamReader outputReader = ps.StandardOutput; 
     StreamReader errorReader = ps.StandardError; 
     StreamWriter inputWrite = ps.StandardInput; 

     // uses extra cheap logging facility 
     inputWrite.WriteLine("echo \"Ripping " + copiedFile + " " + 
      temp.ToString() + "\" >> log.txt"); 

     inputWrite.WriteLine("ffmpeg.exe -i \"" + copiedFile + 
      "\" -f image2 -vframes 1 -y -ss 2 tmp\\" + temp.ToString() + 
      ".jpg"); 

     inputWrite.WriteLine("exit"); 

     ps.WaitForExit(3000); 

     if (ps.HasExited) 
     { 
      string thumbFile = Page.MapPath(@"~\Lib\ffmpeg.rev12665\tmp") + 
       @"\" + temp.ToString() + ".jpg"; 
      // ... 
     } 

Kişisel ffmpeg komut satırı benim örnekten ölçüde değişebilir ... herhangi bir kod lisans konuları, AFAIK etrafında alır, ama bu küçük resimleri çıkmak buldum en istikrarlı yoludur. Ffmpeg ile ilgili çevrimiçi buldum diğer şeyler özellikle bu çözüm (cmd.exe-tabanlı) yoktu, ama bu iyi çalıştığım tek bir tane var. İyi şanslar!

0

WPF'de (v3.0) video oluşturmanın etkili bir yolu olmadığında VideoRendererElement öğesini geri yazdım. Çalışması için biraz korsanlık kullanıyor.

Bazı şeyleri basitleştirmek istiyorsanız, VRE'yi bırakın ve oluşturma için InteropBitmap'i kullanın (WriteableBitmap tamam, ancak etkin değil). Ayrıca SWIG'i bırakın ve C++ dll'inizi bir CLI/C++ dll yapın, böylece C++ ile C# 'dan doğrudan konuşabilirsiniz (ve tersi).

Gitebileceğiniz başka bir yol, taşıma/kod çözme öğelerinizi içeren bir DirectShow kaynak filtresi oluşturmak ve WPF MediaKit benim gibi bir şeyi WPF'ye dönüştürmek için kullanabilirsiniz (D3DImage. 0 kesmelerini kullanır).Ayrıca, LGPL'den korkmayın. Kendi DLL'sinde tuttuğunuz ve kaynağı değiştirmediğiniz sürece, lisans kısıtlamalarına dahil olursunuz.

0

Ayrıca yüklenebilir çeşitli Microsoft Windows Media SDK'larından bir göz olabilir. Bir projede birkaç yıl önce, yüklenen videodan küçük resimler çıkarmak için Windows Media Format SDK'yı kullandık. Bu SDK'lerde ayrıca .NET örnek kodu vardır.

4

Projemizde Microsoft Expression Encoder kullanıyoruz. Bu bedava değil. Farklı biçimleri ve boyutları, özü küçük, vb videoları dönüştürebilirsiniz

İşte

örnektir:

using Microsoft.Expression.Encoder; 

//... 
//skiped 
//... 

MediaItem mediaItem = new MediaItem(videoToEncode.SourceFilePath); 
mediaItem.ApplyPreset(PresetFilePath); 

Job job = new Job(); 
job.ApplyPreset(PresetFilePath); // path to preset file, where settings of bit-rate, codec etc 
job.MediaItems.Add(mediaItem); 

job.EncodeProgress += OnProgress; 
job.EncodeCompleted += EncodeCompleted; 

job.DefaultMediaOutputFileName = "{OriginalFilename}.encoded.{DefaultExtension}"; 
job.CreateSubfolder = false; 

job.OutputDirectory = videoToEncode.EncodedFilePath; 
job.Encode(); 
+0

Expression Encoder'ın ücretsiz sürümünü indirdim ve API, örnekler ile biraz oynadım ve çalışabiliyorsa bir tanıtıcıyı denemek için yansıtıcıdaki kütüphanelere baktım. Güzel bir çözüm gibi görünüyor ama özel bir protokol üzerinden akışı kontrol etmek için ihtiyacım olanı alabileceğime emin değilim. LiveJob nesnesinin bir özelliğe sahip olduğunu, OutputFormat'ın, özel bir aktarım uygulaması gerçekleştirecek şekilde uygulanabileceğine benzeyen bir özellik olduğunu buldum. –

0

Biz çeşitli çıkış formatları (divx kodlanmış avi, flv, mp4 vb) içine video dosyalarını dönüştürüyoruz.END_STRONG mediadatabase uygulamamız için. Medya dönüştürme yapmak için CLI-uygulamaları ile her zaman çalıştığımızdan (EPS dosyalarını ImageMagick/GS kullanarak JPG'ye rasterleştirmekten bahsederek), FFMPEG-CLI'ye yoğun bir şekilde güvendik.

Özel ortamımızda, dönüştürme makineleri olarak "aptal" UNIX sunucularını kullandık (yalnızca sshd, ffmpeg, misc. Ffmpeg kitaplıkları ve samba yüklüdür). Onlar gerçek dönüşüm yapmak için SSH komutları ile C# (WCF web servisi) 'dan PuTTY CLI aracılığıyla kontrol edilir.

ffmpeg için çağrı ssh ile olur ve her TransformationType için uzmanlaşmıştır. Macun CLI C# 's System.Diagnostics.Process ad alanı ile başlatılır, çıkış ve hata mesajları için olaylar günlüğe kaydetme amacıyla ele alınır.

internet "? Nasıl ffmpeg kullanarak flv mpg dönüştürebilirsiniz", araştırma biraz size yardımcı olacak gibi sorular ile ilgili kaynakların bir sürü sağlar. Telif hakkı uygulanmış bir uygulamadan söz ettiğimizden, tam kod alıntılarını yayınlayamıyorum. Ama C# kullanarak arka uçbirimi kodlayan güvenilir, hızlı video hakkında bir mimari fikir vermelisiniz.

6

DirectShow sizin arkadaşınız. DirectShow, Media Player, Audio Encoders gibi Windows "multimedya" uygulamalarının çoğunda kullanılan düşük seviyeli katmandır.

bu kütüphane yerli geliştiriciler için yapılmış olsa bile bunu DirectShow.net başardı dünya sayesinde erişebilirsiniz. http://directshownet.sourceforge.net DirectShow için iyi bilinen ve kararlı yönetilen bir sarıcıdır.

Yapmanız gereken tek şey, grafikler ve filtreler kavramını anlamak ve DirectShow'un gücünü kullanmak için kendi filtrelerinizi ve grafiklerini oluşturmak için biraz DirectShow öğrenmek!

İlgili konular