Dapatkan latensi seperti webrtc dengan ffmpeg?

11

Saya telah menggunakan ini antara Chrome dan ponsel saya:

http://www.webrtc.org/demo

Dan latensi sangat bagus - kurang dari 1 detik.

Saya sudah mencoba meniru itu di komputer saya tanpa hasil.

ffmpeg -f video4linux2 -i /dev/video0  -s 320x200 -r 50 -deadline realtime -vcodec libvpx -f webm -fflags nobuffer udp://10.0.0.55:9002

Dan kemudian menggunakan ffplay di sisi lain.

Masih ada beberapa detik lag untuk itu.

Akhirnya saya ingin melakukan streaming dari komputer saya ke ponsel Android, tetapi latensi harus baik.

Sunting - ini bekerja lebih baik secara signifikan. Jika saya bisa mencukur sedikit dari ini, saya akan senang:

ffmpeg -vcodec rawvideo -f video4linux2 -i /dev/video0  -s 320x200 -r 25 -vcodec libvpx -f rtp -deadline realtime rtp://10.0.0.55:9002
David N. Welton
sumber
1
Tautannya sudah mati. Pada dasarnya Anda ingin mengonversi video dan streaming ke telepon Anda? Di wifi atau eksternal?
jiggunjer
Yang ingin saya lakukan adalah streaming dari kamera yang terpasang ke perangkat dan ditampilkan di tablet Android (Nexus 10) yang terhubung melalui USB.
David N. Welton
1
Saya tidak tahu banyak tentang codec ini tetapi apakah Anda sudah memeriksa bahwa mereka dipercepat perangkat keras jika memungkinkan? Itu akan menjadi dugaan saya mengapa Anda melihat latensi lebih dari 1 detik.
snoopen
vpx akan menjadi sulit untuk ditutup dengan waktu nyata, saya tahu x264 memiliki nada "latensi rendah" atau sesuatu seperti itu FWIW
rogerdpack

Jawaban:

1

Masalahnya sebagian besar dari fakta bahwa Anda menggunakan transcoding perangkat lunak , bukan transcoding perangkat keras .

Sebagai aturan praktis, jika konversi menggunakan akselerasi perangkat keras, latensi akan kurang dari satu detik (biasanya milidetik). Jika dilakukan dalam perangkat lunak, maka latensi akan lebih dari satu detik.

FFmpeg mendukung akselerasi perangkat keras, tetapi biasanya sulit untuk membuatnya berfungsi untuk Anda.

https://trac.ffmpeg.org/wiki/HWAccelIntro

Di sisi lain, Google Chrome mendukung VP8 dan H264 (jika tersedia) pengkodean / decoding perangkat keras, baik di komputer Anda dan ponsel Android Anda:

http://code.google.com/p/chromium/issues/detail?id=428223

Ho1
sumber
1
Ini bukan hanya tentang akselerasi perangkat keras ... konfigurasi codec memainkan peran yang jauh lebih besar dalam latensi. Codec perlu disetel untuk menjaga latensi rendah, dengan mengorbankan kualitas dan bandwidth. Ini dapat dilakukan apakah Anda menggunakan perangkat keras yang dipercepat codec atau tidak.
Brad
Tautan itu secara spesifik mengatakan Chrome TIDAK mendukung pengkodean perangkat keras di desktop, HANYA di android.
davr
Maaf tapi Brad benar, jawabannya benar-benar salah: selama Anda mengatur pengaturan codec yang sama, tidak ada perbedaan sama sekali jika Anda melakukan penyandian perangkat keras atau perangkat lunak (selama Anda memiliki kekuatan CPU yang cukup untuk melakukan penyandian waktu nyata dengan penyandian Anda pengaturan codec). Yang benar adalah bahwa ini bukan hanya tentang pengaturan codec video tetapi kebanyakan tentang jenis transportasi dan perilaku buffering dari decoder. WebRTC berfungsi karena disetel untuk latensi rendah. Dekoder Webm tipikal tidak dimaksudkan untuk melakukan Low-Latency
Harry