di python-vlc - bagaimana cara mengolesi kecepatan pemutaran untuk menyinkronkan dua pemain?

Saya mencoba menyinkronkan pemutaran dua instance VLC. Untuk melakukan ini, saya menggunakan paket UDP. Dari pemain sekunder, saya mengirim paket ke pemain utama dengan posisi saat ini, dan jawaban utama dengan posisinya saat ini. Saya kemudian menggunakan informasi ini untuk memperkirakan latensi. Ini berfungsi dengan baik sampai di sini, dan total waktu proses percakapan UDP dapat diabaikan (berjalan pada host yang sama, ~0,00017 detik, pada koneksi LAN kabel sedikit lebih lama).

Masalahnya dimulai ketika saya mencoba membuat aliran sekunder sejajar. Kalau selisihnya besar, saya tinggal atur posisinya. Ini ternyata kurang tepat, karena pemain memerlukan waktu untuk mencari posisi baru.

Jadi, jika perbedaannya relatif kecil, saya mencoba mengatur kecepatan pemutaran menjadi sedikit lebih cepat atau lebih lambat hingga berada pada frame yang sama (yaitu frame yang seharusnya sama dengan frame is). Masalahnya pemainnya juga agak hang

        media_player.set_rate()

Saya sudah mencoba dengan nilai yang lebih besar (1,2 / 0,9) dan juga yang lebih kecil (1,01 / 0,99), hasilnya serupa.

Saya juga mendapatkan cukup banyak dari ini:

[00007f6b8d9d7ab0] main decoder error: Timestamp conversion failed (delay 1000000, buffering 100000, bound 9000000)
[00007f6b8d9d7ab0] main decoder error: Could not convert timestamp 148752813836 for FFmpeg

dan ini:

[00007f548002e180] main decoder error: Timestamp conversion failed for 41083001: no reference clock
[00007f548002e180] main decoder error: Could not convert timestamp 0 for FFmpeg

Yang terakhir terutama jika saya agak tergila-gila pada frekuensi pembaruan.

Saya bertanya-tanya apakah ada cara lain/lebih baik untuk mencapai ini? saya bertanya-tanya apakah mungkin ada semacam perhitungan yang dapat saya lakukan agar tarif baru lebih baik dengan referensi waktu internal? Kesalahan kedua (tidak ada jam referensi) membuat saya berpikir ada sesuatu yang diinisialisasi ulang secara internal dan karena itu tidak tersedia untuk sesaat.

Bantuan sangat dihargai.


person rmalchow    schedule 15.11.2020    source sumber
comment
Apakah Anda menemukan sumber kesalahan decoder utama tersebut?   -  person beesleep    schedule 27.04.2021


Jawaban (1)


Saya mendapat kesalahan yang sama tetapi dengan memanggil set_position`. Seperti yang Anda perhatikan juga, memanggil fungsi pada frekuensi rendah tidak menghasilkan kesalahan apa pun.

Saya tidak tahu detail penerapan Anda, tetapi Anda dapat menggunakan proxy untuk membatasi frekuensi panggilan.

Dalam kasus saya, saya tidak melihat kesalahan apa pun untuk apa pun di bawah 30fps.

person beesleep    schedule 27.04.2021