Как бы я go о воспроизведении видеопотока с ffpyplayer? - PullRequest
2 голосов
/ 06 января 2020

Первый постер здесь, так что go легко для меня.

Я работаю над забавным небольшим проектом для себя и друзей, в основном я хочу иметь возможность транслировать и получать видео с помощью ffmpeg, как своего рода приложение для обмена экранами. Я полный python нуб, и я просто ухожу от документации для каждого. Вот что у меня есть для отправки:

import ffmpeg
stream = ffmpeg.input("video.mp4")
stream = ffmpeg.output(stream, "tcp://127.0.0.1:1234", format="mpegts")
ffmpeg.run(stream)

Это просто, но работает, когда я запускаю ffplay.exe -i tcp://127.0.0.1:1234?listen -hide_banner в командной строке и запускаю код для отправки видео, это работает отлично, но когда я пытаюсь и используйте мой код для получения видео, все, что я получаю, это аудио, без видео, и после того, как видео закончено, последняя секунда аудио повторяется. Вот код получения:

from ffpyplayer.player import MediaPlayer
test = MediaPlayer("tcp://127.0.0.1:1234?listen")
while True:
    test.get_frame()
    if test == "eof":
        break

Спасибо за любую помощь и извините, если я просто чего-то не замечаю: P

1 Ответ

1 голос
/ 07 января 2020

Вы извлекаете только кадры из video.mp4 в своем коде.

test = MediaPlayer("tcp://127.0.0.1:1234?listen")
while True:
    test.get_frame()
    if test == "eof":
        break

Теперь вам нужно отображать их, используя стороннюю библиотеку, начиная с ffpyplayer не предоставляет никаких встроенных функций для отображения кадров в al oop.

Ниже код использует OpenCV для отображения извлеченных кадров. Установите OpenCV и numpy, используя приведенную ниже команду

pip3 install numpy opencv-python

Измените код получателя на

from ffpyplayer.player import MediaPlayer
import numpy as np
import cv2

player = MediaPlayer("tcp://127.0.0.1:1234?listen")
val = ''
while val != 'eof':
    frame, val = player.get_frame()
    if val != 'eof' and frame is not None:
        img, t = frame
        w = img.get_size()[0] 
        h = img.get_size()[1]
        arr = np.uint8(np.asarray(list(img.to_bytearray()[0])).reshape(h,w,3)) # h - height of frame, w - width of frame, 3 - number of channels in frame
        cv2.imshow('test', arr)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

, вы также можете напрямую запустить команду ffplay, используя python подпроцесс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...