Bagaimana saya bisa membuat Raspivid untuk melewati encoding h264? (menyingkirkan video streaming latensi 5 detik)

11

Ada banyak forum dan utas tentang menyingkirkan latensi 5 detik saat menggunakan Pi bersama dengan PI-Cam sebagai kamera pengintai. Banyak tutorial menunjukkan cara menggunakan vlc untuk menyandikan dan mengalirkan gambar menggunakan protokol RTP yang menghasilkan lag ~ 5 detik.

Menurut saya, alasannya adalah bahwa raspivid menyandikan aliran ke H264, sementara VLC harus mendekodekannya lagi dan menyandikan ulang ke RTP apa pun itu. Baris perintahnya terlihat seperti ini:

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

Bagian pertama memberitahu raspivid untuk mengalirkan video ke output standar:

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

Bagian setelah pipa, memberitahu VLC untuk mengambilnya, dan mendekode menggunakan h264:

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

Mux-ing dan demux-ing ini cukup banyak sumber daya!

Saya menemukan sumber raspicam di github, dan saya pikir ada sesuatu yang dapat dilakukan dalam metode encoder_buffer_callback (saat ini di baris 848) untuk melewati penyandian. Namun saya tidak pandai c, dan tidak terbiasa dengan encoding video sama sekali, jadi saya tidak tahu harus mulai dari mana.

Di Github saya bisa melihat 330 fork, tetapi tampaknya tidak khusus untuk raspicam (lebih untuk seluruh proyek pengguna lahan). Saya tersesat mencoba menemukan garpu yang menghapus pengodean atau mengimplementasikan sesuatu yang lebih sederhana seperti mjpeg.

Bisakah seseorang dengan pengetahuan codec video dan membantu saya dan trilyun pengguna lainnya untuk menyingkirkan latensi? Mungkin solusinya sudah ada di luar sana di salah satu persimpangan itu, tetapi saya telah menghabiskan waktu berjam-jam mencarinya tanpa hasil.

ps Saya tidak mencari solusi peramban , tapi saya akhirnya ingin melakukan streaming ke Synology, lebih disukai menggunakan streaming mjpeg (tetapi tidak melalui halaman web, melainkan aliran mjpeg standar yang dibangun di sebagian besar ip-cams komersial). Langkah pertama adalah menyingkirkan h264.

Louis Somers
sumber
Itu adalah investigasi yang sangat menyeluruh. Menggunakan MJPEG adalah keluar dari pertanyaan karena (pada saat saya sedang mencari) encoder JPEG yang dibangun tidak memiliki perpustakaan dan perangkat lunak adalah sampah. Saya berhasil mendapatkan lag 1s menggunakan nginx-rtmp (paket FLV), custom build, dalam HD! Pi menggunakan sekitar 30% CPU tetapi VLC berjuang untuk memecahkannya karena timing frame yang hilang dan karena itu FLV :( Juga perangkat lunak CCTV saya menggunakan wastafel VLC dan 1 aliran 720p menggunakan 40% CPU ketika saya akhirnya berhasil tetapi sangat tidak stabil
Piotr Kula
@pumkin Saya tidak percaya MJPEG keluar dari pertanyaan. Setelah H264 hilang, kita dapat menyandikan apa pun yang kita inginkan tanpa memiliki overhead decoding dan re-encoding. Sebenarnya memiliki H264 cukup mewah! Hanya kita yang bisa mematikannya. Ini seperti sebuah tahta berlapis berlian dan berlian yang mewah di kamar toilet yang sempit sehingga tidak ada lagi yang cocok di ruangan itu (kecuali untuk beberapa ruang kepala di mana kita bisa melompat-lompat sedikit) ... ketika Anda membuka pintu, Anda harus memanjat lebih dari sandaran tangan yang tinggi, dan ketika Anda duduk tidak ada ruang untuk kaki Anda ...
Louis Somers
Ya, saya mengerti maksud Anda. Saya telah menghabiskan waktu berhari-hari untuk mencoba mendapatkan MJPEG dalam kualitas yang layak untuk server IP CCTV saya. Banyak hal telah berubah tetapi perangkat keras JPEG langsung menyandikan dan mem-piping ke aliran, karena API tidak tersedia. Satu-satunya cara saya tahu adalah perangkat lunak dan solusi terbaik yang saya temukan adalah nginx-rtmp JPEG sink. HLS untuk iPhone benar-benar bekerja dengan baik tetapi mendapat lag 5s-10s :(
Piotr Kula
1
Anda dapat mencoba mengangkat ini sebagai pertanyaan pada proyek Github untuk perangkat lunak kamera. Anda mungkin akan mendapatkan penjelasan mengapa hal itu sulit dilakukan, tetapi jika orang lain menganggapnya fitur yang bermanfaat, seseorang mungkin mengimplementasikannya.
TomG
demux tidak sama dengan decode ... silakan periksa ini
Flash Thunder

Jawaban:

5

Itu mungkin bukan yang Anda inginkan dari jawaban, tapi saya tidak merekomendasikan streaming VLC sama sekali ..

Untuk proyek sekolah, saya mencoba beberapa opsi streaming (di RPi juga!):

  • VLC
  • MJPEG
  • GStreamer

Menggunakan VLC dan MJPEG (dan beberapa lainnya yang kurang dikenal), saya memiliki latensi antara 3 dan 5 detik ..
Menggunakan GStreamer, NO LATENCY dan dengan resolusi terbaik (dan banyak opsi lainnya)!
Jika Anda tertarik, Anda bisa memeriksanya di sini .

Dan jika Anda akan menggunakannya, inilah pipa saya:

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
Val
sumber
1
Ya, saya sudah mencoba Gstreamer dan berfungsi dengan baik ketika streaming ke PC atau lebih, tetapi tidak bekerja dengan baik dengan perangkat lunak pihak ke-3 seperti Synology DiskStation. Sepertinya GStreamer hanya menggunakan kembali aliran H264 dan membungkus protokol streaming di sekitarnya tanpa mendekodekannya, yang merupakan solusi bagus tapi sayangnya untuk sejumlah kecil kasus penggunaan. Jika saya ingin melihat aliran pada perangkat Android saya harus mengembangkan aplikasi saya sendiri untuk itu. MJPEG jauh lebih banyak didukung, dan saya yakin Raspivid dapat diubah untuk melompati penyandian yang tidak perlu dan meninggalkannya ke VLC atau lebih. Terima kasih atas tipnya
Louis Somers
1
Saya juga punya Synology tetapi tidak mencoba GStreamer di atasnya (saya pikir tidak cukup kuat). Btw, tentang Android, Anda juga bisa menggunakan GStreamer di dalamnya! Saya menggunakannya untuk proyek saya dan bekerja dengan baik :)!
Val
Masalah dengan gstreamer itu tidak termasuk timeframeinterval ke dalam data frame dan tidak dapat digunakan sebagai sink (bahkan dengan opsi ditambahkan !!) :( Ada skrip mod yang tersedia untuk pipa melalui tapi saya menemukan penerima gstreamer untuk VLC bom sering keluar. Ini tentang 6 bulan yang lalu ketika saya mencari untuk melakukan saome CCTV .. tapi itu tidak pernah berhasil andal :(
Piotr Kula
@ Val benar, ada SDK untuk Android, tetapi tidak banyak pemain out-of-the-box di play-store yang mendukung pipa seperti gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! videoconvert! sinkronisasi autovideosink = salah. Untuk iOS bahkan tersedia lebih sedikit. Synology adalah pusat yang hebat yang mendukung sebagian besar perangkat utama, dapat melakukan deteksi gerakan, perekaman dan pemberitahuan, semuanya di luar kotak (dan tanpa kartu SD yang melayang).
Louis Somers
Apakah Anda masih menggunakan ini seperti ini? Ada driver U4VL baru, tetapi masih masalah lag yang sama dengan h264 streaming ke VLC
Piotr Kula
0

Beberapa orang telah bekerja keras dalam hal ini sejak saya pertama kali menanyakan pertanyaan ini, dan saat ini ada beberapa pilihan (aneh bahwa belum ada yang menjawab pertanyaan ini). Saya telah mencoba RaspberrIPCam dan berhasil, namun sepertinya paket rtsp memiliki TTL yang sangat pendek atau sesuatu. Setelah Pi terhubung langsung ke router di sebelah PC saya, itu akan bekerja dengan sempurna. Tetapi segera setelah saya menginstal cam di tempat yang saya inginkan, dan mencoba mengakses aliran dengan dua router di antaranya, tidak ada gambar yang akan tiba. Saya memeriksa kode sumber dan menemukan TTL diatur ke maksimum. Saya tidak pernah menemukan jawabannya sepenuhnya.

Saat ini saya akan merekomendasikan RaspberryIPCamera yang memiliki antarmuka pengguna yang bagus (lihat screenshot ) dan bahkan ada gambar SD-card yang sudah jadi untuk itu. Saya sudah mencoba SD-card, tetapi kembali melakukan instalasi manual seperti yang dijelaskan di sini dengan sangat sukses (setup saya saat ini). Instruksi untuk menghubungkannya ke Synology DiskStation juga tersedia dan bekerja dengan baik pada sistem saya. Masalah dengan gambar kartu SD adalah bahwa saya tidak dapat memperluas sistem file ke tingkat penuh dari kartu SD (saya juga ingin menjalankan beberapa hal lain di atasnya untuk mengontrol beberapa relay melalui pin GPIO).

Solusi di atas menggunakan komponen proyek UV4L. Dokumentasi proyek UV4L pada halaman ini juga menyebutkan:

Di antara hal-hal lain, ia menawarkan antarmuka Web yang memungkinkan untuk melihat aliran video dengan berbagai cara dan Halaman Kontrol yang memungkinkan untuk sepenuhnya mengontrol pengaturan kamera saat streaming dengan aplikasi Video4Linux apa pun.

Saya belum mencobanya meskipun begitu (karena saya tidak ingin mengacaukan pengaturan saya saat ini).

Louis Somers
sumber
1
Tidak yakin apakah ini masalah Anda, tetapi jika Anda mengirim lalu lintas multicast RTSP melalui router, pastikan IGMP mengintai diaktifkan dan pastikan PC Anda tidak memblokir pertanyaan IGMP dari router. Jika tidak, router tidak akan menyadari PC Anda sedang mencoba menerima paket, sehingga tidak akan pernah meneruskannya.
Malvineous