Streaming langsung video stereo ke kacamata VR (Oculus Go)

Kami tidak akan melakukan bagian pengantar yang panjang, kami akan langsung ke intinya.

Jadi, ada kamera stereo yang dapat mengirimkan video H264 melalui berbagai protokol. Ada kacamata Oculus Go. Bagaimana cara menonton siaran langsung stereo dari kamera dalam kacamata VR? Ini diinginkan, dengan penundaan minimum dan secara lokal, sehingga Youtube dan layanan video RTMP lainnya menghilang.

Ke depan, itulah yang terjadi. Pada awalnya - pemutaran file video yang direkam sebelumnya dari stereo, kemudian pemutaran streaming langsung dari StereoPi (MPEG-TS via UDP).


Kamera stereo yang saya gunakan adalah StereoPi, jadi saya akan memberikan contoh spesifik terkait dengan itu. Sebenarnya, ini adalah raspberry biasa, tetapi dengan dua kamera, jadi contoh yang dijelaskan dapat dicoba di raspberry biasa, jika Anda benar-benar menginginkannya. Benar, Anda harus menginstal firmware dari StereoPi.
Hal pertama adalah upaya membuat aplikasi Android biasa yang memutar aliran dari kamera ke layar penuh, dan mengisinya ke dalam oculus dengan metode sideload (via adb).

Setelah beberapa memilih dengan manifes, kacamata setuju untuk mempertimbangkan aplikasi ini asli. Itu muncul di "Sumber Tidak Diketahui" di perpustakaan, itu dimulai, itu menunjukkan semua yang diperlukan, tetapi ada masalah - gerakan kepala tidak diperhitungkan, video dari kamera hanya ditampilkan dengan bodohnya di layar penuh dengan kacamata. Efek stereonya adalah, ya, tetapi begitu Anda sedikit menggerakkan kepala, orang Moskow itu mulai menjadi gila, yang menyebabkan perasaan yang sangat, sangat tidak nyaman.

Jika itu, inilah aplikasi .apk: StereoPi untuk Oculus Go Pada saat yang sama di arsip dan adb kebohongan, sehingga Anda dapat segera mencoba mengisi gelas. Hanya perintah

adb install StereoPi.apk 

Setelah itu, pergi ke Perpustakaan -> Sumber tidak dikenal, aplikasi com.virt2real.stereopi akan muncul di sana



Kami memulainya dan jika StereoPi berada di jaringan area lokal yang sama dengan kacamata, kami segera melihat gambar stereo dari kamera.

Tapi ini sampah ... Saya ingin aplikasi asli normal untuk oculus menonton video. Sehingga ada layar yang tidak bergerak dan agar tidak menyerbu saat menggerakkan kepala Anda. Saya belum siap untuk belajar Unity untuk oculus, jadi saya punya ide untuk mencoba menggunakan aplikasi pemutar video yang sudah ada di toko Oculus. Saya biasanya menonton film 3D di Skybox , jadi saya mencoba menggunakannya.

Selain tampilan file media yang biasa dari flash drive built-in dan dari perangkat jaringan, item menarik "Airscreen" ditemukan di Skybox. Ternyata Anda dapat menginstal aplikasi Skybox di komputer dengan Windows (baik, atau di Mac), beri dia file video dan kemudian menjadi mungkin untuk menonton file video ini dengan kacamata. Yaitu Aplikasi Windows adalah server video, dan kacamata - klien. Saya tidak menemukan protokol komunikasi di mana pun, jadi saya harus mengungkap tcpdump.

Setelah penggalian singkat, ternyata Skybox menggunakan pesan broadcast UDP untuk mencari server di LAN. Pesannya terlihat seperti ini:

 {"command":"search","project":"direwolf","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceType":"vr","udpPort":"6881"} 


Semua pesan di JSON sangat nyaman.

Untuk pesan ini, kami perlu mengirim tanggapan ke host dan port pengirim yang ditentukan dalam pesan, mis. 6881

 {"udp":true,"project":"direwolf server","command":"searchResult","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","computerId":"53709de962eba2f9695c8a926562486c","computerName":"STEREO-PI","ip":"192.168.1.51","ips":["192.168.1.51"],"port":6888} 

Di sini kami menunjukkan host dan port kami yang menjalankan server WebSockets. Semua komunikasi lebih lanjut akan melalui soket web.

Misalnya, pesan pertama melalui soket web akan seperti ini:

 {"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true} 

Kami menjawabnya:

 {"command":"addDevice","deviceId":"66a86b57-b292-3957-9fc9-4041d5e1f841","deviceName":"Oculus Pacific","deviceType":"vr","showLoginCode":true} 

Dan setelah itu, di Skybox dengan kacamata kita akan melihat StereoPi kita. Berikutnya adalah banyak permintaan yang harus Anda kirim jawabannya. Konten daftar putar, misalnya.

Contoh daftar putar untuk Skybox
[{id: 'livestream-rtsp',
nama: 'Streaming Langsung RTSP',
durasi: 0,
ukuran: 0,
url: 'rtsp: //192.168.1.51: 554 / h264',
thumbnail: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailLebar: 186,
thumbnailTinggi: 120,
lastModified: 1,
pengaturan defaultVR: 1,
pengaturan penggunaVR: 2,
lebar: 1280,
tinggi: 720,
orientDegree: '0',
subtitle: [],
ratioTypeFor2DScreen: 'default',
rotasiFor2DScreen: 0,
ada: benar
isBadMedia: false,
ditambahkanTime: 1},
{id: 'livestream-mpegts',
nama: 'Streaming Langsung MPEG-TS',
durasi: 0,
ukuran: 0,
url: 'udp: // @: 3001',
thumbnail: 'http://192.168.1.51/thumbnail/livestream.png',
thumbnailLebar: 186,
thumbnailTinggi: 120,
lastModified: 1,
pengaturan defaultVR: 1,
pengaturan penggunaVR: 2,
lebar: 1280,
tinggi: 720,
orientDegree: '0',
subtitle: [],
ratioTypeFor2DScreen: 'default',
rotasiFor2DScreen: 0,
ada: benar
isBadMedia: false,
ditambahkanTime: 1}]

Ini sangat menarik sejak itu dalam daftar putar yang membentuk aplikasi Windows, singkatan RTSP yang didambakan ditemukan. Ternyata aplikasi server stream file video melalui RTSP, yang sudah cocok untuk streaming video langsung, yang tentu saja kita butuhkan. Lebih tepatnya, ternyata ada "RTSP" di daftar putar, tetapi tautan ke file video adalah http biasa. Yaitu aplikasi server masih mengirim file melalui HTTP, tetapi ini tidak cocok untuk kita. Pada titik ini, saya sudah kesal, tapi saya pikir, mengapa tidak mencoba untuk memberikan tautan dalam daftar putar dalam format yang biasanya dipahami oleh VLC, mis. rtsp: //192.168.1.51: 554 / h264 Dan bersorak, Skybox mulai memutar aliran video dari server RTSP dalam stereo. Penundaannya sangat besar, 20 detik, jadi terus terang. Kami mencoba untuk memberi makan aliran UDP ke MPEG-TS. Sekali lagi, VLC biasanya memakan ini menggunakan tautan udp: // @: 3001, untuk Skybox saya mencoba menentukan dengan cara yang sama. Kemudian tinggal mengarahkan aliran MPEG-TS ke sejumlah kacamata dan port UDP yang ditentukan. GStreamer terlibat untuk ini:

 raspivid -3d sbs -w 1280 -h 720 -o - | gst-launch-1.0 -q fdsrc ! h264parse ! mpegtsmux alignment=7 name=muxer ! rndbuffersize max=1316 min=1316 ! multiudpsink clients="192.168.1.60:3001" sync=false 

Di skybox, kita klik elemen daftar putar "Live Stream MPEG-TS" dan voila, kita melihat streaming MPEG-TS langsung di layar lebar di bioskop virtual. Penundaan jauh lebih sedikit dibandingkan dengan RTSP, 2-3 detik, tetapi masih lebih banyak dari pada aplikasi sederhana saya yang menerima aliran H264 mentah di atas UDP (biasanya ada penundaan 100-150 ms pada resolusi 720p).

Kemudian saya menemui jalan buntu, sejauh ini saya belum berhasil mengurangi penundaan. Mungkin Anda perlu menonaktifkan buffering di Skybox sendiri, saya akan mencoba menulis kepada pengembang, mungkin mereka akan membuat opsi "Nonaktifkan buffering" :-)

Kesimpulannya


Secara umum, jika tiba-tiba karena suatu alasan Anda tiba-tiba perlu menonton streaming video langsung di oculi atau kacamata VR lainnya (Skybox tersedia di banyak platform seperti) - Anda dapat mencoba metode yang saya jelaskan. Saya tidak tahu apakah ini akan bekerja dengan kamera stereo lain, tetapi dengan StereoPi yang dicentang, itu bajak.

Referensi


Sumber server untuk skybox
Utas forum dengan diskusi

Terima kasih semuanya, semuanya gratis.

Oh ya, aku hampir lupa. Jika tiba-tiba seseorang dapat membantu dengan aplikasi asli untuk oculus (sehingga terlihat seperti Skybox) - menulis dalam surat pribadi, kami akan membahas detailnya.

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


All Articles