ใน python-vlc - ฉันจะละเลงอัตราการเล่นเพื่อซิงโครไนซ์ผู้เล่นสองคนได้อย่างไร

ฉันกำลังพยายามซิงโครไนซ์การเล่น VLC สองอินสแตนซ์ ในการดำเนินการนี้ ฉันกำลังใช้แพ็กเก็ต UDP จากผู้เล่นรอง ฉันส่งแพ็กเก็ตไปยังผู้เล่นหลักที่มีตำแหน่งปัจจุบัน และคำตอบหลักพร้อมตำแหน่งปัจจุบัน จากนั้นฉันใช้ข้อมูลนี้เพื่อประเมินเวลาแฝง สิ่งนี้ใช้ได้ดีจนถึงที่นี่ และรันไทม์ทั้งหมดของการสนทนา UDP นั้นเล็กน้อย (ทำงานบนโฮสต์เดียวกันคือ ~ 0.00017s บนการเชื่อมต่อ LAN แบบมีสายมากกว่าเล็กน้อย)

ปัญหาเริ่มต้นขึ้นเมื่อฉันพยายามทำให้สตรีมรองเข้าแถว หากความแตกต่างใหญ่ ฉันก็แค่กำหนดตำแหน่ง สิ่งนี้จบลงด้วยความไม่แม่นยำมากนัก เนื่องจากผู้เล่นต้องใช้เวลาพอสมควรเพื่อค้นหาตำแหน่งใหม่

ดังนั้น หากความแตกต่างค่อนข้างน้อย ฉันก็ลองตั้งค่าอัตราการเล่นให้เร็วขึ้นหรือช้าลงเล็กน้อยจนกว่าจะอยู่ในเฟรมเดียวกัน (เช่น เฟรมควรเท่ากับเฟรม is) ปัญหาคือผู้เล่นยังค้างอยู่นิดหน่อย

        media_player.set_rate()

ฉันได้ลองใช้ค่าที่ใหญ่กว่า (1.2 / 0.9) และค่าที่น้อยกว่า (1.01 / 0.99) ผลลัพธ์ก็ใกล้เคียงกัน

ฉันยังได้รับสิ่งนี้ค่อนข้างมาก:

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

และนี่:

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

อย่างหลังโดยเฉพาะอย่างยิ่งถ้าฉันคลั่งไคล้ความถี่ในการอัปเดตเล็กน้อย

ฉันสงสัยว่ามีวิธีอื่น / ที่ดีกว่าในการบรรลุเป้าหมายนี้หรือไม่? ฉันสงสัยว่าอาจมีการคำนวณบางอย่างที่เกี่ยวข้องที่ฉันสามารถทำได้เพื่อให้อัตราใหม่สอดคล้องกับการอ้างอิงเวลาภายในดีขึ้นหรือไม่ ข้อผิดพลาดครั้งที่สอง (ไม่มีนาฬิกาอ้างอิง) ทำให้ฉันคิดว่ามีบางอย่างภายในถูกเริ่มต้นใหม่ และเนื่องจากไม่สามารถใช้งานได้ชั่วขณะหนึ่ง

ความช่วยเหลือได้รับการชื่นชมอย่างมาก


person rmalchow    schedule 15.11.2020    source แหล่งที่มา
comment
คุณพบสาเหตุของข้อผิดพลาดตัวถอดรหัสหลักเหล่านั้นหรือไม่   -  person beesleep    schedule 27.04.2021


คำตอบ (1)


ฉันได้รับข้อผิดพลาดเดียวกัน แต่โดยการเรียก set_position` อย่างที่คุณสังเกตเห็นเช่นกัน การเรียกใช้ฟังก์ชันที่ความถี่ต่ำไม่ได้ทำให้เกิดข้อผิดพลาดใดๆ

ฉันไม่ทราบรายละเอียดการใช้งานของคุณ แต่คุณสามารถใช้พรอกซีเพื่อจำกัดความถี่ของการโทรได้

ในกรณีของฉัน ฉันไม่เห็นข้อผิดพลาดใดๆ ที่ต่ำกว่า 30fps

person beesleep    schedule 27.04.2021