Saya mendapatkan Pi B + dan kamera Pi dan sekarang saya mencoba menemukan konfigurasi (CPU rendah) yang paling efisien dan terendah untuk mengalirkan video yang dikodekan H.264 dari kamera ke server rumah saya.
Saya sudah membaca yang berikut ini:
(Semua tautan menggunakan gstreamer-1.0 dari deb http://vontaene.de/raspbian-updates/ . main
.)
Banyak yang telah dilakukan dalam hal ini dalam beberapa tahun terakhir.
Awalnya, kami harus menyalurkan output raspivid
ke gst-launch-1.0
(lihat tautan 1).
Kemudian (tautan 2) dibuat driver V4L2 resmi yang sekarang menjadi standar, dan memungkinkan untuk secara langsung mendapatkan data tanpa pipa, menggunakan hanya gstreamer (lihat terutama pos oleh towolf »Sat 07 Des 2013, 3:34 pm dalam tautan 2):
Pengirim (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000
Penerima: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Jika saya mengerti dengan benar, kedua cara menggunakan GPU untuk melakukan decoding H264, tetapi yang kedua agak lebih efisien karena tidak perlu melalui kernel lain kali karena tidak ada pipa antara proses yang terlibat.
Sekarang saya punya beberapa pertanyaan tentang ini.
Apakah yang terakhir masih merupakan cara terbaru untuk mendapatkan H264 dari kamera secara efisien? Saya pernah membaca tentang
gst-omx
, yang memungkinkan saluran pipa gstreamer seperti... video/x-raw ! omxh264enc ! ...
. Apakah ini melakukan sesuatu yang berbeda dengan hanya menggunakanvideo/x-h264
, atau bahkan mungkin lebih efisien? Apa bedanya?Bagaimana cara mengetahui plugin encoding gstreamer apa yang sebenarnya digunakan ketika saya menggunakan
video/x-h264 ...
pipeline? Ini tampaknya hanya menentukan format yang saya inginkan, dibandingkan dengan bagian pipa lainnya, di mana saya secara eksplisit memberi nama komponen (kode) (sukah264parse
ataufpsdisplaysink
).Dalam balasan ini untuk menghubungkan 1 Mikael Lepistö menyebutkan "Saya menghapus satu pass filter yang tidak perlu dari sisi streaming" , yang berarti bahwa ia memotong
gdppay
dangdpdepay
. Apa yang mereka lakukan? Mengapa mereka dibutuhkan? Bisakah saya benar-benar menanggalkannya?Dia juga menyebutkan bahwa dengan menentukan
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
parameter untukudpsrc
di sisi penerima, dia dapat memulai / melanjutkan streaming di tengah aliran. Apa yang dicapai topi ini, mengapa pilihan spesifik ini, di mana saya dapat membaca lebih banyak tentang mereka?Ketika saya melakukan apa yang disarankan di pertanyaan 3 dan 4 (menambahkan
caps
, menjatuhkan,gdppay
dangdpdepay
) maka latensi video saya menjadi jauh lebih buruk (dan tampaknya terakumulasi, latensi meningkat seiring waktu, dan setelah beberapa menit video berhenti)! Kenapa bisa begitu? Saya ingin mendapatkan latensi yang saya peroleh dengan perintah asli, tetapi juga memiliki fitur untuk dapat bergabung dengan aliran kapan saja.Saya telah membaca bahwa RTSP + RTP biasanya menggunakan kombinasi TCP dan UDP: TCP untuk pesan kontrol dan hal-hal lain yang tidak boleh hilang, dan UDP untuk transmisi data video aktual. Pada pengaturan di atas, apakah saya benar-benar menggunakan itu, atau apakah saya hanya menggunakan UDP saja? Ini agak buram bagi saya apakah Gstreamer menangani ini atau tidak.
Saya akan menghargai jawaban apa pun untuk satu pun dari pertanyaan ini!
|
menciptakan masalah dalam konteks ini adalah bagian yang luar biasa dari BS. Sudahkah Anda mencobaraspivid | cvlc
metode apa pun ? Saya belum punya kamera untuk waktu yang sangat lama atau banyak waktu untuk bermain dengannya, tetapi menggunakannya untuk menghasilkan aliran http (dapat dilihat di linux di ujung w /vlc
) tampaknya bekerja dengan baik.cat file | grep ...
bukangrep ... file
. Pipa menambahkan lapisan lain penyalinan ke dan dari kernel, yang mudah diukur, terutama pada perangkat dengan bandwidth memori rendah. Jika gstreamer dapat membaca dari file perangkat secara langsung, mengapa tidak menggunakannya? Mengenairaspivid | cvlc
saran Anda : Saya menggunakan ini sebelum saya beralih ke solusi berbasis gstreamer, ia memiliki latensi hingga 3 detik lebih banyak daripada gstreamer (saya tidak tahu mengapa).cvlc
menggunakan ~ 45%, tetapi hanya berjalan melalui pipa pada kecepatan data itu (ingat lagi, pipa tidak memperlambatnya ) tidak akan menggerakkan jarum, saya pikir. Suka <5%. Tidak sepenuhnya sepele jika Anda ingin melakukan ini seefisien mungkin tentu saja ...raspivid | cvlc
yang 40-50%. Orang-orang mungkin merespons dengan lebih baik pertanyaan yang menantang mereka untuk memperbaiki angka tertentu. Saat ini Anda banyak bertanya mengapa, tanpa menjelaskan mengapa masing-masing alasan itu penting.Jawaban:
Opsi:
raspivid -t 0 -o - | nc -k -l 1234
raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264
cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'
raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234
gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234
uv4l --driver raspicam
picam --alsadev hw:1,0
Hal-hal yang perlu dipertimbangkan
top -d 10
)Perbandingan:
sumber
?
"?Satu- satunya cara modern untuk mengalirkan H264 ke browser adalah dengan UV4L : tidak ada latensi, tidak ada konfigurasi, dengan audio opsional, audio / video dua arah opsional. Tidak ada saus GStreamer ajaib, namun masih memungkinkan untuk memperpanjang penggunaannya.
sumber
uv4l
? Pipa gstreamer saya terlihat cukup usang sekarang! Tidak sabar untuk menguji bagaimana latensi itu!1.) h264 streaming di seluruh jaringan (hanya sampel)
di server:
pada klien:
2.) streaming mjpeg di seluruh jaringan (hanya sampel)
di server:
pada klien:
semua ini bahkan berfungsi pada RPi Zero W (dikonfigurasi sebagai server)
sumber
sample only
artinya?