Raspivid'in h264 kodlamasını atlamasını nasıl sağlayabilirim? (5 saniye gecikmeli video akışından kurtulma)


11

Bir Pi'yi bir gözetim kamerası olarak PI-Cam ile birlikte kullanırken 5 saniyelik bir gecikmeden kurtulma konusunda forumlar ve iplikler var. Birçok öğretici, ~ 5 saniye gecikme ile sonuçlanan RTP protokolünü kullanarak görüntüleri kodlamak ve akış için vlc'nin nasıl kullanılacağını gösterir.

Bana göre bunun nedeni, raspivid'in akışı H264'e kodlaması, VLC'nin deşifresini çözmesi ve RTP'nin olduğu her şeye yeniden kodlaması gerekiyor. Komut satırı şöyle görünür:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

İlk bölüm, raspivid'e videoyu standart çıkışa aktarmasını söyler:

raspivid -w 640 -h 480 -o - -t 0 

Borudan sonraki kısım, VLC'ye onu almasını ve h264 kullanarak kodunu çözmesini söyler:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Bu mux-ing ve demux-ing oldukça kaynakların belidir!

Github'da raspicam kaynaklarını buldum ve kodlamayı atlamak için encoder_buffer_callback yönteminde (şu anda satır 848'de) bir şey yapılabileceğini düşünüyorum. Ancak ben c iyi değil ve hiç video kodlama aşina değil, bu yüzden nereden başlayacak bir ipucu yok.

Github'da 330 çatal görebilirsiniz, ancak özellikle raspicam için değil (tüm kullanıcı projesi için). Kodlamayı kaldıran veya mjpeg gibi daha basit bir şey uygulayan bir çatal bulmaya çalışırken kayboldum.

C ve video codec bileşeni bilgisine sahip biri bana ve diğer gazillion kullanıcılarına gecikmeden kurtulmaları için yardımcı olabilir mi? Muhtemelen çözüm zaten bu çatallardan birinde zaten var, ama şanssız bir şekilde aramak için saatlerce harcadım.

ps Bir tarayıcı çözümü aramıyorum , ama nihayetinde tercihen mjpeg akışı kullanarak bir Synology'ye akış yapmak istiyorum (ancak bir web sayfası üzerinden değil, çoğu ticari ip kamerada yerleşik olarak gelen standart bir mjpeg akışı). İlk adım h264'ten kurtulmaktır.


Bu çok kapsamlı bir soruşturma. MJPEG kullanımı söz konusu değil çünkü (o zaman baktığımda) yerleşik JPEG kodlayıcıda kütüphane yoktu ve yazılım çöptü. HD'de nginx-rtmp (FLV paketlenmiş), özel yapı kullanarak yaklaşık 1 saniye gecikmeyi başardım! Pi yaklaşık% 30 CPU kullandı, ancak VLC eksik ve FLV nedeniyle zamanlama çerçeveleri nedeniyle kodunu çözmek için mücadele etti :( Ayrıca CCTV yazılımım VLC lavabo kullandı ve sonunda çalıştığımda 1 720p akışı% 40 CPU kullandı, ancak çok kararsız.
Piotr Kula

@ppumkin MJPEG'in söz konusu olmadığına inanmıyorum. H264 gittikten sonra, kod çözme ve yeniden kodlama yükü olmadan dilediğimiz her şeyi kodlayabiliriz. Aslında H264'e sahip olmak oldukça lüks! Sadece biz onu kapatabiliriz. Odada başka bir şey uymuyor (biraz yukarı ve aşağı atlayabileceğimiz bazı tavan boşluğu hariç) ... kapıyı açtığınızda, tırmanmanız gerekiyor yüksek bir kol dayama yeri üzerinde ve oturduğunuzda bacaklarınız için yer kalmadı ...
Louis Somers

Evet ne demek istediğini anlıyorum. CCTV IP sunucuma iyi kalitede MJPEG almaya çalışırken gün geçirdim. Birçok şey değişti, ancak API mevcut olmadığından, donanım JPEG kodlaması ve bir akışa doğrudan boru bağlantısı mevcut değil. Bilmemin tek yolu yazılım ve bulduğum en iyi çözüm nginx-rtmp JPEG lavabo idi. İPhone için HLS aslında harika çalışıyor, ancak 5s-10s gecikmesi var :(
Piotr Kula

1
Bunu kamera yazılımı için Github projesinde bir soru olarak gündeme getirmeyi deneyebilirsiniz. Muhtemelen yapmanın zor olduğuna dair bir açıklama alacaksınız, ancak başkaları bunu yararlı bir özellik bulursa, birisi uygulayabilir.
TomG

Demux ... Lütfen kod çözme aynı değildir bu onay
Flaş Thunder

Yanıtlar:


5

Muhtemelen cevaplardan istediğin bu değil, ama VLC akışını hiç önermiyorum.

Bir okul projesi için bazı akış seçeneklerini denedim (RPi'de de!):

  • VLC
  • MJPEG
  • Gstreamer

VLC ve MJPEG (ve daha az bilinen) kullanarak, 3 ila 5 saniye arasında gecikme yaşadım ..
GStreamer kullanarak, LATENCY ve en iyi çözünürlük (ve daha birçok seçenek)!
Eğer ilgilenen varsa, bunu kontrol edebilirsiniz burada .

Ve eğer kullanırsan, işte benim boru hattım:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
Evet, zaten Gstreamer'ı denedim ve bir PC'ye akarken harika çalışıyor, ancak Synology DiskStation gibi 3. taraf yazılımlarla iyi çalışmıyor. GStreamer sadece h264 akışını yeniden kullanıyor ve kod çözmeden bir akış protokolünü sarar, bu harika bir çözümdür, ancak ne yazık ki az sayıda kullanım durumu için. Akışı bir Android cihazda görmek istersem bunun için kendi uygulamamı geliştirmeliydim. MJPEG çok daha yaygın bir şekilde desteklenmektedir ve eminim Raspivid, VLC'ye veya daha fazlasına bırakarak gereksiz kodlamayı atlamak için değiştirilebilir. Her şekilde bahşiş için teşekkürler
Louis Somers

1
Ayrıca bir Synology var ama üzerinde GStreamer denemedim (benimki yeterince güçlü değil bence). Btw, Android hakkında, GStreamer'ı da kullanabilirsiniz! Projem için kullanıyorum ve iyi çalışıyor :)!
Val

Gstreamer ile ilgili sorun çerçeve verisine timeframeinterval içermez ve bir lavabo olarak kullanılamaz (seçenek eklenmiş olsa bile !!) :( Üzerinden geçebilecek mod komut dosyaları vardır, ancak VLC bombalarına gstreamer alıp sık sık buldum. 6 ay önce saome CCTV yapmak istediğimde .. ama asla güvenilir bir şekilde çalışmadı :(
Piotr Kula

@Val true, Android için bir SDK var, ancak oyun mağazasında gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234 gibi boru hatlarını destekleyen çok sayıda oyuncu yok! gdpdepay! rtph264depay! avdec_h264! video dönüştürme! autovideosink senkronizasyonu = yanlış. İOS için daha az kullanılabilir. Synology, çoğu ana cihazı destekleyen, hareket algılama, kayıt ve bildirimler yapabilir, hepsi kutudan çıkar çıkmaz (ve SD kartları beklemeden) harika bir merkezdir.
Louis Somers

Bunu hala böyle mi kullanıyorsun? Yeni U4VL sürücüsü var, ancak h264'ün VLC'ye akışıyla ilgili aynı gecikme sorunları var
Piotr Kula

0

Bazıları bu soruyu ilk sorduğumdan beri bu konuda çok çalışıyorlar ve bu zamana kadar birkaç seçenek var (kimsenin bu soruya henüz cevap vermediği garip). RaspberrIPCam denedim ve bazı başarılar vardı, ancak rtsp paketleri son derece kısa bir TTL ya da bir şey gibi görünüyor. Pi'nin doğrudan bilgisayarımın yanındaki bir yönlendiriciye bağlanması mükemmel çalışır. Ama kamerayı istediğim yere yükler yüklemez ve aradaki iki yönlendirici ile akışa erişmeye çalıştığımda görüntü gelmezdi. Kaynak kodunu kontrol ettim ve TTL'yi maksimuma ayarladım. Hiç tam olarak çözemedim.

Şu anda güzel bir kullanıcı arayüzü ( ekran görüntülerine bakın ) olan RaspberryIPCamera'yı tavsiye ederim ve hatta bunun için hazır bir SD kart görüntüsü var. SD kartı denedim, ancak burada açıklandığı gibi manuel kurulum yapmaya başladım (mevcut kurulumum). Bir Synology DiskStation'a bağlamaya yönelik talimatlar da mevcuttur ve sistemimde mükemmel şekilde çalışmaktadır. SD kart görüntüsüyle ilgili sorun, dosya sistemini SD kartın tam boyutuna genişletemediğim oldu (GPIO pinleri aracılığıyla bazı röleleri kontrol etmek için üzerinde başka şeyler de çalıştırmak istiyorum).

Yukarıdaki çözüm UV4L projesinin bileşenlerini kullanmaktadır. UV4L projesinin bu sayfadaki dokümantasyonunda ayrıca:

Diğer şeylerin yanı sıra, video akışını çeşitli şekillerde görebileceğiniz bir Web arayüzü ve herhangi bir Video4Linux uygulamasıyla akış sırasında kamera ayarlarını tamamen kontrol etmenizi sağlayan bir Kontrol Sayfası sunar.

Henüz bu göl henüz denemedim (mevcut kurulumumu berbat etmek istemediğim için).


1
Sorunun bu olup olmadığından emin değilim, ancak bir yönlendirici üzerinden çok noktaya yayın RTSP trafiği gönderiyorsanız, IGMP gözetleme özelliğinin etkinleştirildiğinden emin olun ve bilgisayarınızın IGMP sorgularını yönlendiriciden engellemediğinden emin olun. Aksi takdirde yönlendirici, bilgisayarınızın paketleri almaya çalıştığını fark etmez, bu yüzden onları asla iletmez.
Malvineous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.