2010-01-14 31 views
5

Bazılarınızın bu problemle nasıl başa çıkacağını öğrenmek istedim. Bir robotum var, bu linux kullanıyor ve bir v4l2 sürücüsü ile bir web kamerası kullanıyor. Gtkmm ile bir kontrol paneli yazdım. Hem sunucu hem de istemci C++ ile yazılmıştır. Sunucu robot, istemci "kontrol paneli" dir. görüntü analiz robot üzerinde oluyor ve ben iki sebepten dolayı kontrol paneline kameradan video geri akışı istiyorum: A) görüntü analizi bindirmek için eğlenceli B) içinBirden fazla kaynağa video ve video akışı

Yani benim sorum sonuçları web kamerasından kontrol paneline video yayınlamanın iyi bir yoludur ve robot kodunun işlenmesini önceliği verir mi? Kendi video sıkıştırma şemamı yazmakla ve onu mevcut ağ bağlantı noktasına yazarak ilgilenmiyorum, yeni bir ağ bağlantı noktası (video verisine adanmış) en iyi ihtimalle bence. Sorunun ikinci kısmı, videoyu gtkmm'de nasıl görüntüleyebilirim? Video verisi eşzamansız olarak geliyor ve gtkmm'de main() üzerinde kontrol sahibi değilim, bu yüzden bu çok zor olur.

ben vlc, gstreamer ya da ben bilmem başka genel sıkıştırma kütüphaneleri gibi şeyler kullanarak açığım.

Teşekkürler!

DÜZENLEME: Robot, 1XHz işlemciye sahip, linux sürümü gibi bir masaüstü çalıştıran, ancak X11 yok.

+0

sadece bir düşünce: Bu VLC akışlı video almak için bir kullanıcı uygulamasında bir VLC kütüphanesini kullanmak mümkün mü? Eğer öyleyse vlc akışına sahip olabilirdim ve daha sonra görüntü analizi bir geri döngü bağlantısından video verilerini almasını sağladı ve kontrol paneli aynı şeyi uzaktan gerçekleştiriyor. –

+1

vlc hakkında emin değilim, ancak ffserver gömmek için oldukça kolaydır. –

+0

btw vlc ve ffserver hem Ffmpeg dayanmaktadır (libavcodec/ibavformat) –

cevap

1

Gstreamer çok az çaba ile, sizin için bu neredeyse tüm çözer ve ayrıca Glib olay sistemiyle güzel bütünleşir. Gstreamer video kodunu/kodlama/boyutlandırmak için V4L kaynak eklentileri, gtk + çıkış widget'lar, çeşitli filtreler içerir ve hepsinden önemlisi, ağ lavabo ve kaynaklar makineler arasında veri taşımak için.

Prototip için, video boru hatlarını monte etmek ve test etmek için 'gst-launch' aracını kullanabilirsiniz, daha sonra kodunuzda programatik olarak boru hatları oluşturmak oldukça basittir. Web kameraları ve benzerleri ile bunu yapan kişilerin örneklerini görmek için 'GStreamer ağ akışını' arayın.

0

Ben kullanılan gerçek teknolojiler hakkında emin değilim, ama kare düştü kaçınmak istiyorsanız bu ***** büyük senkronizasyon sonunda olabilir. Bir dosyayı aynı anda bir dosyaya ve ağa aktarıyordum. Nihayetinde yaptığım şey, üç işaretli büyük bir dairesel tampon kullanıyordu: bir yazma ve iki okuma. Üç kontrol parçacığı (ve bazı ek kodlama iplikleri) vardı: Tampona yazma, arabellekte herhangi bir diğeri tarafından okunmayan bir noktaya ulaştığında duracak olan arabelleğe yazma ve arabellekten okuyup yazacak iki okuyucuyu yazdı. dosya/ağ (ve üreticinin önüne geçtiyse duraklat). Her şey yazıldığından ve çerçeveler olarak okunduğundan, senkronizasyon yükü minimumda tutulabilir.

Yapımcım bir kod dönüştürücüydü (başka bir dosya kaynağından), ancak sizin durumunuzda, kameranın normalde ne olursa olsun tam çerçeveler üretmesini ve yalnızca sunucu için kod dönüştürmeyi (ffmpeg gibi) yapmasını isteyebilirsiniz. Robot görüntüyü işlerken.

Sorununuz biraz daha karmaşıktır, çünkü robotun gerçek zamanlı geri bildirim alması gerektiğinden, duraklatma sunucusunun yetişmesini ve beklemesini bekleyemez. Bu nedenle, kontrol sistemine kareleri olabildiğince hızlı bir şekilde almak ve "kontrol paneline" aktarım için ayrı ayrı dairesel bir tamponda tamponlamak isteyebilirsiniz. Bazı kodekler, diğerlerine göre daha iyi kareleri yakalarlar, bu nedenle ağ arkada kalırsa, tamponun sonunda karelerin üzerine yazmaya başlayabilirsiniz (okunamayacaklarına dikkat ederek).

+0

Çerçeveler bırakarak umursamıyorum. Video işlem her neyse işlenemiyor. –

0

'Yeni bir video bağlantı noktası' deyin ve sonra vlc/gstreaming hakkında konuşmaya başladığınızda ne istediğinizi bulmakta zorlanıyorum. Açıkçası bu yazılım paketleri, bir dizi protokol aracılığıyla akışa ve sıkıştırmaya yardımcı olacaktır, ancak akışı göndermek için bir 'video portu' olmayan bir 'ağ portuna' ihtiyacınız olacaktır.

Eğer gerçekten ne demek istediğinizi başka bir konu olan kablosuz video/tv beslemesi aracılığıyla ekran çıkışı gönderiyorsanız, bununla ilgili olarak yazılım uzmanlarından ziyade donanım uzmanlarından tavsiye almanız gerekecektir.

Taşıma. MMS/UDP protokolleri üzerinden çok fazla akış yaptım ve vlc (sunucu ve istemci olarak) çok iyi işliyor. Ancak, masaüstü bilgisayarlar için tasarlanmış ve istediğiniz kadar hafif olmayabilir. Gstreamer, mencoder veya ffmpeg gibi bir şey daha iyi olacak diye düşünüyorum.Robotun ne tür bir işlemci var? Gerçek zamanlı sıkıştırmayı planlıyorsanız biraz hile gerekir. İstemci tarafında

Sana GTK videoyu işlemek için widget bir dizi bulacağınızı düşünüyoruz. Arayüz detayları konusunda endişelenmeden önce bunu incelerdim.

+0

Evet, üzgünüm. Video verileri için "yeni ağ bağlantı noktası" diyorum. Bunu yansıtmak için bir düzenleme yapıldı. Ayrıca CPU bilgisi için düzenlenmiştir. Ben gtkmm widget'ı hakkında gerçekten endişeli değilim , ben gerekirse ben sadece bazı SDL Widget kullanabilirsiniz biliyorum ... ama video belirli bir hatta daha iyi olurdu. –

İlgili konular