Siarkan video h264 tanpa transkoding dari kamera Logitech C920



Penundaannya tidak lebih dari 0,3 detik, mengingat fakta bahwa kamera terhubung ke BeagleBone Blue yang lemah dengan beban prosesor tidak lebih dari 30% dan aliran video ditransmisikan melalui router wifi ke laptop.

Awalnya, tugasnya adalah menyiarkan video dari robot ke komputer besar tanpa memuat prosesor pada robot dan tanpa penundaan. Dalam proses googling kamera dan program untuk tugas ini, ditemukan bahwa ada kamera dengan pengkodean video berbasis perangkat keras pada kamera itu sendiri , setelah itu kamera Logitech C920 dibeli. Dan tes dan percobaan dimulai, di mana dua opsi terjemahan ditemukan tanpa transcoding.

Semua tindakan lebih lanjut diperiksa pada Ubuntu 16.04, opsi kedua mungkin bekerja pada Windows

Perangkat keras siaran menyandikan video dari kamera Logitech C920 melalui cvlc dan v4l2


clvc - server menyiarkan video melalui vlc dari baris perintah.

Perangkat keras menyandikan aliran video


Atur kamera format pixel ke H264

v4l2-ctl --device=/dev/video1 --set-fmt-video=width=800,height=600,pixelformat=1 

Uji H264 dengan vlc, sehingga tidak akan mengatur ulang pengaturan:

 cvlc v4l2:///dev/video1 --demux h264 

Jika Anda mencoba ini, vlc akan mengatur ulang pengaturan sebelum bermain:

 cvlc v4l2:///dev/video1:chroma=h264 

Pemutaran bekerja. Kami mendapatkan aliran H264 dari kamera. Sekarang mari kita melewati jaringan melalui HTTP:

 cvlc v4l2:///dev/video1:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv 

(pada jaringan, Anda perlu menggunakan alamat IP perangkat lokal Anda dan bukan localhost)

Peluncuran Penerima:

 mplayer http://localhost:8080/ 

Ternyata MPEG-TS memungkinkan mplayer untuk terhubung ke streaming kapan saja dengan sedikit penundaan (mungkin menunggu frame kunci atau sth).

Jika Anda menggunakan mux = avi, mime = video / avi, Anda harus menjalankan mplayer saat Anda memulai vlc, jika tidak mplayer tidak akan mulai bermain.

Kesalahan ffmpeg


  • Jika Anda mencoba ffmpeg alih-alih vlc untuk bermain, Anda mungkin akan mengalami masalah ini: ffmpeg.org/trac/ffmpeg/ticket/1387
  • Segera setelah Anda menjalankan ffmpeg, itu akan beralih ke "Video: rawvideo (YUY2 / 0x32595559)"
  • Saat menerima MJPEG, itu tidak akan bekerja dengan H.264
  • Hal yang sama terjadi ketika menggunakan qv4l2: mulai menangkap dalam mode H264 sebenarnya memberi Anda jendela video YUY2

Putar video yang diterjemahkan ke perangkat keras


Mplayer dapat memainkan framebuffer, pastikan X tidak berfungsi dan masukkan:

 mplayer http://192.168.1.100:8080/ -fs -framedrop -vo fbdev 

Anda juga dapat bermain di jendela X jika ingin: jalankan X dari baris perintah:

 Xorg -retro &> /dev/zero 

Ada banyak pesan kesalahan fbdev yang diam-diam kita masukkan / dev / nol

Putar aliran video dari sumber LAN vlc (lihat bagian di atas):

 DISPLAY=":0" mplayer http://192.168.1.100:8080/ -fs -framedrop 

  • Jika kami melakukan ini, kami akan melihat bahwa kami belum menggunakan Xvideo atau akselerasi perangkat keras apa pun
  • linux-sunxi.org/CedarX tampaknya memberi kita perpustakaan VPU, yang sayangnya merupakan hal yang tidak aman bagi Allwinner
  • Tetapi ada VLC yang diretas yang dapat menggunakannya: linux-sunxi.org/VLC
  • Berhasil dikompilasi

Raspberry pi


Jika Anda mengalami artefak dalam gambar, dan stream dari Raspberry Pi gunakan:

 cvlc v4l2:///dev/video0:chroma=h264 ... 

Anda mungkin perlu memperbarui firmware:

 apt-get install rpi-update raspi-config rpi-update reboot 

Ringkasan siaran via cvlc dan v4l2


Pengujian menunjukkan bahwa beban prosesor pada Beaglebone Blue tidak lebih dari 30%, yang sangat baik untuk prosesor yang lemah, tetapi tidak jelas bagaimana cara mendorong video ini ke ROS.

Jika bandwidth wifi tidak cukup maka penundaan video meningkat pesat, secara teori ini dapat diatasi dengan beralih dari tcp ke udp, dokumentasi cvlc menyebutkan kemungkinan penyiaran melalui udp.

Perangkat keras siaran yang disandikan video dari kamera Logitech C920 via Gstreamer


Artikel pengembang asli yang mendukung metode ini di Gstreamer.
Instal gstreamer di Ubuntu 16.04

 sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools sudo apt-get install libgstreamer-plugins-base1.0-dev 

Sumber uvch264src memungkinkan Anda untuk:


  • Secara bersamaan menangkap aliran video yang disandikan perangkat keras h264 dan aliran video perayap.
  • Konfigurasikan pengodean video perangkat keras (bitrate, bingkai kunci, dan lainnya)

Sumber jendela bidik sekunder adalah konsep yang menarik. Selain aliran H.264 utama, Anda mendapatkan aliran sekunder resolusi rendah dalam format MJPG atau YUV. Saya tidak yakin apakah ini fitur kamera gstreamer, driver, atau blok sumber, tetapi saya berharap ini akan berguna untuk kamera Beaglebone kami, asalkan fungsinya tidak menggunakan prosesor yang terlalu besar untuk mengkonversi antara mentah dan jpg.

Berikut ini adalah contoh pipa yang menampilkan aliran H.264 resolusi tinggi dan aliran jendela bidik:

 gst-launch-1.0 -v -e uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Aliran utama H.264 diterjemahkan dengan menggunakan blok avdec_h264, dapat diakses melalui paket gst-libav, lihat catatan pada wiki oz9aec . Panel jendela bidik dapat dihubungkan ke fakelink jika tidak diperlukan, tetapi saya tidak berpikir itu dapat dinonaktifkan (Anda masih dapat menonaktifkannya). Setidaknya ini adalah kesan bahwa saya membaca posting blog KaKaRoTo asli.

Anda mungkin akan kelebihan beban ketika Anda melihat sejumlah besar parameter yang dapat dikonfigurasi untuk blok sumber ini:

 gst-inspect-1.0 uvch264src 

Daftar parameter Uvch264src
Rincian Pabrik:
Peringkat tidak ada (0)
Nama panjang Sumber UVC H264
Sumber / video klass
Deskripsi UVC H264 Pengkodean sumber kamera
Penulis Youness Alaoui <youness.alaoui@collabora.co.uk>

Rincian Plugin:
Beri nama uvch264
Deskripsi UVC compliant H264 encoding plugins kamera
Namafile / usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstuvch264.so
Versi 1.8.3
Lisensi LGPL
Modul sumber gst-plugins-bad
Tanggal rilis sumber 2016-08-19
Paket biner GStreamer Bad Plugins (Ubuntu)
URL Asal launchpad.net/distros/ubuntu/+source/gst-plugins-bad1.0

GObject
+ ---- Secara resmi tidak dimiliki
+ ---- GstObject
+ ---- GstElement
+ ---- GstBin
+ ---- GstBaseCameraSrc
+ ---- GstUvcH264Src

Antarmuka yang Diimplementasikan:
Gstchildproxy

Templat Pad:
Template SRC: 'vidsrc'
Ketersediaan: Selalu
Kemampuan:
video / x-raw
format: {I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV21 , NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_104104_1010 , GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE}
lebar: [1, 2147483647]
tinggi: [1, 2147483647]
framerate: [0/1, 2147483647/1]
gambar / jpeg
lebar: [1, 2147483647]
tinggi: [1, 2147483647]
framerate: [0/1, 2147483647/1]
video / x-h264
lebar: [1, 2147483647]
tinggi: [1, 2147483647]
framerate: [0/1, 2147483647/1]
stream-format: {byte-stream, avc}
perataan: au
profil: {tinggi, utama, garis dasar, garis dasar terbatas}

Template SRC: 'imgsrc'
Ketersediaan: Selalu
Kemampuan:
KOSONG

Template SRC: 'vfsrc'
Ketersediaan: Selalu
Kemampuan:
video / x-raw
format: {I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV21 , NV61, NV24, GRAY8, GRAY16_BE, GRAY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_104104_1010 , GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE}
lebar: [1, 2147483647]
tinggi: [1, 2147483647]
framerate: [0/1, 2147483647/1]
gambar / jpeg
lebar: [1, 2147483647]
tinggi: [1, 2147483647]
framerate: [0/1, 2147483647/1]

Bendera Elemen:
tidak ada bendera yang ditetapkan

Bendera nampan:
tidak ada bendera yang ditetapkan

Implementasi Elemen:
Memiliki fungsi change_state (): 0x7ff438f22ba0

Elemen tidak memiliki kemampuan pencatatan jam kerja.
Elemen tidak memiliki kemampuan penanganan URI.

Bantalan:
Src: 'vfsrc'
Src: 'imgsrc'
SRC: 'vidsrc'

Properti elemen:
nama: Nama objek
bendera: baca, tulis
Tali Default: "uvch264src0"
induk: induk dari objek
bendera: baca, tulis
Objek tipe "GstObject"
penanganan async: Nampan akan menangani perubahan status Asinkron
bendera: baca, tulis
Boolean. Default: false
penerusan pesan: Meneruskan semua pesan anak-anak
bendera: baca, tulis
Boolean. Default: false
mode: Mode pengambilan (pengambilan foto diam atau perekaman video)
bendera: baca, tulis
Enum "GstCameraBin2Mode" Default: 2, "mode-video"
(1): mode-gambar - Pengambilan foto diam (default)
(2): mode-video - Perekaman video
zoom: Faktor pembesaran digital (mis. 1,5 berarti 1,5x)
bendera: baca, tulis
Mengapung. Kisaran: 1 - 3.402823e + 38 Default: 1
max-zoom: Faktor pembesaran digital (mis. 1,5 berarti 1,5x)
bendera: dapat dibaca
Mengapung. Kisaran: 1 - 3.402823e + 38 Default: 10
ready-for-capture: Menginformasikan elemen ini siap memulai tangkapan lain
bendera: dapat dibaca
Boolean. Default: benar
post-preview: Jika menangkap gambar pratinjau harus diposting ke bus
bendera: baca, tulis
Boolean. Default: benar
caps-preview: Tutup dari gambar preview yang akan diposting (NULL berarti APA SAJA)
bendera: baca, tulis
APA SAJA

preview-filter: Filter pratinjau khusus untuk memproses pratinjau data gambar
bendera: baca, tulis
Objek tipe "GstElement"
mulai otomatis: Secara otomatis mulai menangkap ketika pergi ke status PAUSED
bendera: baca, tulis
Boolean. Default: false
colorspace-name: Nama elemen colorspace
bendera: baca, tulis, hanya bisa NULL atau SIAP
Tali Default: "videoconvert"
jpeg-decoder-name: Nama elemen decoder jpeg
bendera: baca, tulis, hanya bisa NULL atau SIAP
Tali Default: "jpegdec"
num-clock-samples: Jumlah sampel jam untuk dikumpulkan untuk sinkronisasi PTS (-1 = tidak terbatas)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: 0 - 2147483647 Default: 0
num-buffer: Jumlah buffer ke output sebelum mengirim EOS (-1 = tidak terbatas)
bendera: baca, tulis
Integer Kisaran: -1 - 2147483647 Default: -1
perangkat: Lokasi perangkat
bendera: baca, tulis
Tali Default: "/ dev / video0"
device-name: Nama perangkat
bendera: dapat dibaca
Tali Default: ""
initial-bitrate: Bitrate awal dalam bits / detik (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Integer yang Tidak Ditandatangani. Kisaran: 0 - 4294967295 Default: 3.000.000
slice-units: Unit slice (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Integer yang Tidak Ditandatangani. Kisaran: 0 - 65535 Default: 4
slice-mode: Menentukan unit properti slice-unit (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Enum "UvcH264SliceMode" Default: 3, "slice / frame"
(0): diabaikan - Diabaikan
(1): bits / slice - Bits per slice
(2): MBs / slice - MBs per Slice
(3): slice / frame - Slice Per Frame
iframe-period: Waktu antara frame IDR dalam milidetik (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Integer yang Tidak Ditandatangani. Kisaran: 0 - 65535 Default: 10000
tipe penggunaan: Jenis penggunaan (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Enum "UvcH264UsageType" Default: 1, "realtime"
(1): realtime - Realtime (konferensi video)
(2): disiarkan - Siaran
(3): penyimpanan - Penyimpanan
(4): ucconfig0 - UCConfig 0
(5): ucconfig1 - UCConfig 1
(6): ucconfig2q - UCConfig 2Q
(7): ucconfig2s - UCConfig 2S
(8): ucconfig3 - UCConfig 3
entropi: Entropy (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Enum "UvcH264Entropy" Default: 0, "cavlc"
(0): cavlc - CAVLC
(1): cabac - CABAC
enable-sei: Mengaktifkan pewaktuan gambar SEI (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Boolean. Default: false
num-menyusun ulang-frame: Jumlah frame B antara frame referensi (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Integer yang Tidak Ditandatangani. Kisaran: 0 - 255 Default: 0
pratinjau-membalik: gambar membalik horisontal untuk aliran non H.264 (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Boolean. Default: false
leaky-bucket-size: Ukuran ukuran bucket bocor dalam milidetik (kontrol statis)
bendera: baca, tulis, hanya bisa NULL atau SIAP
Integer yang Tidak Ditandatangani. Kisaran: 0 - 65535 Default: 1000
kontrol tingkat: mode kontrol tingkat (kontrol statis & dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Enum "UvcH264RateControl" Default: 1, "cbr"
(1): cbr - laju bit konstan
(2): vbr - Laju bit variabel
(3): qp - QP Konstan
fixed-framerate: Fixed framerate (kontrol statis & dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Boolean. Default: false
max-mbps: Jumlah makroblok per detik untuk kecepatan pemrosesan maksimum
bendera: dapat dibaca
Integer yang Tidak Ditandatangani. Kisaran: 0 - 4294967295 Default: 0
level-idc: Level IDC (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer yang Tidak Ditandatangani. Kisaran: 0 - 255 Default: 40
peak-bitrate: Bitrate puncak dalam bit / detik (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer yang Tidak Ditandatangani. Kisaran: 0 - 4294967295 Default: 3.000.000
bitrate rata-rata: Bitrate rata-rata dalam bit / detik (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer yang Tidak Ditandatangani. Kisaran: 0 - 4294967295 Default: 3.000.000
min-iframe-qp: Ukuran langkah Kuantisasi minimum untuk frame I (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 10
max-iframe-qp: Ukuran langkah Kuantisasi minimum untuk frame I (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 46
min-pframe-qp: Ukuran langkah Kuantisasi minimum untuk bingkai P (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 10
max-pframe-qp: Ukuran langkah Kuantisasi minimum untuk bingkai P (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 46
min-bframe-qp: Ukuran langkah Kuantisasi minimum untuk bingkai B (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 10
max-bframe-qp: Ukuran langkah Kuantisasi minimum untuk bingkai B (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: -127 - 127 Default: 46
ltr-buffer-size: Jumlah total frame Referensi Jangka Panjang (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: 0 - 255 Default: 0
ltr-encoder-control: Jumlah bingkai LTR yang dapat dikendalikan perangkat (kontrol dinamis)
bendera: baca, tulis, bisa NULL, SIAP, DITINGGALKAN atau MAINKAN
Integer Kisaran: 0 - 255 Default: 0

Tindakan Elemen:
"Get-enum-setting": gboolean user_function (objek GstElement *,
gchararray arg0,
gpointer arg1,
gpointer arg2);
"Get-boolean-setting": gboolean user_function (objek GstElement *,
gchararray arg0,
gpointer arg1,
gpointer arg2);
"Get-int-setting": gboolean user_function (objek GstElement *,
gchararray arg0,
gpointer arg1,
gpointer arg2,
gpointer arg3);
"Mulai-tangkap": void user_function (objek GstElement *);
"Stop-capture": void user_function (objek GstElement *);

Banyak dari parameter ini dapat digunakan untuk mengkonfigurasi parameter dalam kompresi H.264. Saya menemukan ini agak mengejutkan mengingat kompresi dilakukan oleh chip di dalam kamera. Contoh berikut meningkatkan kecepatan data default dari 3 menjadi 5 Mbps dan mengurangi interval keyframe default dari 10 menjadi 3 detik:

 gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=3000 device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Di sisi lain, tidak ada parameter untuk menyesuaikan parameter webcam yang biasa, seperti kontras, kecerahan, fokus, dll. Jadi, untuk mengkonfigurasinya, kita masih memerlukan alat eksternal, seperti v4l2.ctl, atau opsi yang disebutkan dalam bagian selanjutnya.

v4l2src


Sepertinya kita juga bisa menggunakan v4l2src lama yang bagus untuk menangkap stream yang dikodekan H.264 dari Logitech C920:

 gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Ini kemungkinan disebabkan oleh evolusi gstreamer dan V4L2. Opsi ini terlihat lebih sederhana jika Anda tidak perlu mengubah pengaturan kompresi H.264, dan ini memberi kami akses ke pengaturan kamera seperti kecerahan dan kontras. Ini juga memiliki keuntungan berada dalam paket plugin yang baik yang mungkin lebih baik disimpan di masa depan.

Webcasting via Gstreamer


Di komputer penerima, mulai penerima:

 gst-launch-1.0 -v udpsrc port=6666 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink 

Pada perangkat dengan kamera, kami memulai transmisi video yang disandikan dengan perangkat keras:

 gst-launch-1.0 uvch264src name=src auto-start=true src.vidsrc ! video/x-h264,width=160,height=120,framerate=30/1 ! h264parse ! rtph264pay ! udpsink host=192.168.1.196 port=6666 

Terima kasih khusus kepada Amomum karena membantu saya menulis kode ini.

Ringkasan Penundaan Siaran Video melalui Gstreamer


Bahkan dengan resolusi 1920 * 1080, beban prosesor pada Beaglebone Blue tidak melebihi 30%, dan penundaan video tidak lebih dari 0,3 detik. Ya, karena video dalam versi ini disiarkan melalui udp, ketika paket-paket hilang, gambar berantakan ke bingkai kunci berikutnya, tetapi kita dapat mengonfigurasinya sehingga bingkai kunci dikirim lebih sering.

Tugas ROS


Tetap sekarang hanya untuk mendorong video yang diterima ke ROS, jika ada yang bisa membantu dengan ini, tulis secara pribadi.

Source: https://habr.com/ru/post/id415567/


All Articles