ffmpeg + pygameで動画を表示する


  • ストリーミング動画のプレイヤーにちょっとしたUIがついたものをつくりたい
  • WebRTCをRaspberryPiやPINE64のブラウザ使うのは厳しかったので、代替案を探している
  • ffplayは割と普通に動いているのでネイティブに近いやつなら大丈夫かも
  • ffmpegでデコードしてpygame(中身はSDL)で表示させてみることにした

コード

video_player.py
import pygame
import subprocess as sp
import numpy as np

cmd = ["ffmpeg", "-i", "kemono_960x540.mp4", "-loglevel", "quiet", "-an", "-r", "10", "-pix_fmt", "rgb24", "-f", "image2pipe", "-vcodec", "rawvideo", "-"]
pipe = sp.Popen(cmd, stdin = sp.PIPE, stdout = sp.PIPE)

pygame.init()
display = pygame.display.set_mode((960, 540))
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    row_img = pipe.stdout.read(960*540*3)
    img = np.frombuffer(row_img, dtype='uint8').reshape((540,960,3))
    img = np.swapaxes(img, 0, 1)
    #print(img);break
    surf = pygame.surfarray.make_surface(img)
    display.blit(surf, (0, 0))
    pygame.display.update()
pygame.quit()

動かす

とりあえずmacOSで。

$ brew install ffmpeg
$ pipenv install numpy
$ pipenv install pygame
$ pipenv run python video_player.py

参考