Я пытаюсь передать кадры с веб-камеры на UDP-адрес. Вот мой код отправителя.
cmd = ['ffmpeg', '-y', '-f', 'rawvideo', '-pixel_format', 'bgr24', '-video_size', f'{width}x{height}',
'-i', '-', '-c:v', 'mpeg4','-preset', 'ultrafast', '-tune', 'zerolatency','-b:v', '1.5M',
'-f', 'mpegts', f'udp://@{ip_address}:{port}']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
camera = cv2.VideoCapture(0)
while True:
ret, frame = camera.read()
cv2.imshow("Sender",frame)
if not ret:
break
p.stdin.write(frame.tobytes())
p.stdin.flush()
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Этот код Python может успешно выполнять поток. Я могу читать поток с этим кодом приемника.
q = queue.Queue()
def receive():
cap = cv2.VideoCapture('udp://@xxx.x.xxx.xxx:5000')
ret, frame = cap.read()
q.put(frame)
while ret:
ret, frame = cap.read()
q.put(frame)
def display():
while True:
if q.empty() != True:
frame = q.get()
cv2.imshow('Receiver', frame)
k = cv2.waitKey(1) & 0xff
if k == 27: # press 'ESC' to quit
break
tr = threading.Thread(target=receive, daemon=True)
td = threading.Thread(target=display)
tr.start()
td.start()
td.join()
Но не могу смотреть стрим с VLC. Я иду в Медиа->Открыть сетевой поток-> udp://@xxx.x.xxx.xxx:5000 для просмотра трансляции. Через несколько секунд таймер, расположенный внизу слева от VLC, начинает увеличиваться, но на экране нет кадров, только значок VLC.
Я проверил правила брандмауэра, открыл все порты для UDP-соединений. Я использую свой IP-адрес для отправки кадров и просмотра их. Кроме того, я пробовал другие видеокодеки, такие как h264, hvec, mpeg4, rawvideo. Кроме того, я пытался смотреть поток с помощью проигрывателя Windows Media, но это не сработало.
Что мне делать, чтобы решить эту проблему?






Пробовал смотреть поток из mpv и все заработало, думаю проблема в баге VLC