目前如何在Pygame中播放视频?

notproplayer 3

我希望在游戏中添加视频(例如剪辑场景或动画菜单屏幕)。

我四处张望,似乎pygame不再支持视频播放,因此我想知道是否还有另一种方法可以使视频很好地集成到我的游戏中,例如在后台播放视频以及pygame元素(开始按钮等)在前台。

金斯利

某处有一个示例(我无法找到原始链接),该示例使用FFMPEG和另一个python模块通过管道解码帧并将其读入PyGame进行显示。我复制了一个代码段(我是这样想的),却忘记了。

我现在已经适应了这种技术来制作一个VideoSprite它使用FFMPEG解码(和重新缩放)视频流,在子update()画面期间读取该视频流以获取下一帧。

这是一个非常粗糙的实现,但是我希望它使您对可能的想法有所了解。如果PyGame仅自己播放视频会很好,但至少此方法会将视频解码和缩放扩展到一个子进程,该子进程希望在另一个CPU上运行。

(编辑:添加了视频结束处理程序和适当的FPS控制)

import pygame
import subprocess

# Window size
WINDOW_WIDTH    = 600
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54)

### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Video Sprite")


class VideoSprite( pygame.sprite.Sprite ):
    FFMPEG_BIN = "/usr/bin/ffmpeg"   # Full path to ffmpeg executable

    def __init__(self, rect, filename, FPS=25 ):
        pygame.sprite.Sprite.__init__(self)
        command = [ self.FFMPEG_BIN,
                    '-loglevel', 'quiet',
                    '-i', filename,
                    '-f', 'image2pipe',
                    '-s', '%dx%d' % (rect.width, rect.height),
                    '-pix_fmt', 'rgb24',
                    '-vcodec', 'rawvideo', '-' ]
        self.bytes_per_frame = rect.width * rect.height * 3
        self.proc   = subprocess.Popen( command, stdout=subprocess.PIPE, bufsize=self.bytes_per_frame*3 )
        self.image  = pygame.Surface( ( rect.width, rect.height ), pygame.HWSURFACE )
        self.rect   = self.image.get_rect()
        self.rect.x = rect.x
        self.rect.y = rect.y
        # Used to maintain frame-rate
        self.last_at     = 0           # time frame starts to show
        self.frame_delay = 1000 / FPS  # milliseconds duration to show frame
        self.video_stop  = False

    def update( self ):
        if ( not self.video_stop ):
            time_now = pygame.time.get_ticks()
            if ( time_now > self.last_at + self.frame_delay ):   # has the frame shown for long enough
                self.last_at = time_now
                try:
                    raw_image = self.proc.stdout.read( self.bytes_per_frame )
                    self.image = pygame.image.frombuffer(raw_image, (self.rect.width, self.rect.height), 'RGB')
                    #self.proc.stdout.flush()  - doesn't seem to be necessary
                except:
                    # error getting data, end of file?  Black Screen it
                    self.image = pygame.Surface( ( self.rect.width, self.rect.height ), pygame.HWSURFACE )
                    self.image.fill( ( 0,0,0 ) )
                    self.video_stop = True


### Create Video Area
video_sprite1 = VideoSprite( pygame.Rect( 100, 100, 320, 240 ), '1975_test_pattern.mp4' )
video_sprite2 = VideoSprite( pygame.Rect( 100, 100, 160,  90 ), '/home/kingsley/Videos/rocket.avi' )  # 640x360
#sprite_group = pygame.sprite.GroupSingle()
sprite_group = pygame.sprite.Group()
sprite_group.add( video_sprite1 )
sprite_group.add( video_sprite2 )

### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # On mouse-click
            pass

    # Movement keys
    keys = pygame.key.get_pressed()
    if ( keys[pygame.K_UP] ):
        video_sprite2.rect.y -= 10
    if ( keys[pygame.K_DOWN] ):
        video_sprite2.rect.y += 10
    if ( keys[pygame.K_LEFT] ):
        video_sprite2.rect.x -= 10
    if ( keys[pygame.K_RIGHT] ):
        video_sprite2.rect.x += 10
    

    # Update the window, but not more than 60fps
    sprite_group.update()
    window.fill( DARK_BLUE )
    sprite_group.draw( window )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(25)  # matching my video file

pygame.quit()

显然,由于只是视频流,所以没有声音。但是出于所有意图和目的,它只是另一个精灵。视频用完后,我们会发现错误并变黑。

示例输出

注意:有时,当我运行此命令时,它会破坏Linux中的终端回显。我怀疑这与子流程和/或管道有关。运行reset可解决此问题。子流程似乎是一个普遍的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在pygame中加载和播放视频

来自分类Dev

如何在余烬应用程序中播放YouTube视频

来自分类Dev

如何在UIWebView中播放时更改嵌入视频的大小?

来自分类Dev

如何在Google Glass的WebView中播放YouTube视频

来自分类Dev

如何在QML中播放视频?

来自分类Dev

如何在Android的WebView中播放Dailymotion视频

来自分类Dev

如何在Surfaceview中隐藏视频并保持音频播放

来自分类Dev

如何在UIWebview中获取当前正在播放的视频的URL

来自分类Dev

如何在iOS Sprite Kit SKVideoNode中控制视频的播放?

来自分类Dev

如何在Android videoview中播放VIMEO视频URL

来自分类Dev

如何在iPhone Phonegap中播放内联视频

来自分类Dev

如何在静音的UIWebView中播放youtube视频?

来自分类Dev

如何在iOS中播放视频PHAsset?

来自分类Dev

如何在Mozilla FIrefox中播放MKV视频?

来自分类Dev

在PyGame 2中播放视频

来自分类Dev

React Native:如何在FlatList中播放视频

来自分类Dev

如何在浏览器中播放实时视频?

来自分类Dev

如何在Flutter中播放视频列表?

来自分类Dev

如何在html中连续播放许多视频文件

来自分类Dev

如何在Windows Phone 7中播放YouTube视频?

来自分类Dev

如何在Firefox中播放音频和视频流?

来自分类Dev

如何在pygame中加载和播放视频

来自分类Dev

如何在Android中创建简单的视频播放器?

来自分类Dev

如何在Google Glass的WebView中播放YouTube视频

来自分类Dev

如何在本机播放器中播放youtube视频以及如何下载youtube视频

来自分类Dev

如何在YouTube中播放私人视频?

来自分类Dev

如何在WPF中向后播放视频?

来自分类Dev

如何在jQuery中播放视频并暂停播放?

来自分类Dev

如何在 Qt Designer 中推广的 QVideoWidget 中播放视频?

Related 相关文章

  1. 1

    如何在pygame中加载和播放视频

  2. 2

    如何在余烬应用程序中播放YouTube视频

  3. 3

    如何在UIWebView中播放时更改嵌入视频的大小?

  4. 4

    如何在Google Glass的WebView中播放YouTube视频

  5. 5

    如何在QML中播放视频?

  6. 6

    如何在Android的WebView中播放Dailymotion视频

  7. 7

    如何在Surfaceview中隐藏视频并保持音频播放

  8. 8

    如何在UIWebview中获取当前正在播放的视频的URL

  9. 9

    如何在iOS Sprite Kit SKVideoNode中控制视频的播放?

  10. 10

    如何在Android videoview中播放VIMEO视频URL

  11. 11

    如何在iPhone Phonegap中播放内联视频

  12. 12

    如何在静音的UIWebView中播放youtube视频?

  13. 13

    如何在iOS中播放视频PHAsset?

  14. 14

    如何在Mozilla FIrefox中播放MKV视频?

  15. 15

    在PyGame 2中播放视频

  16. 16

    React Native:如何在FlatList中播放视频

  17. 17

    如何在浏览器中播放实时视频?

  18. 18

    如何在Flutter中播放视频列表?

  19. 19

    如何在html中连续播放许多视频文件

  20. 20

    如何在Windows Phone 7中播放YouTube视频?

  21. 21

    如何在Firefox中播放音频和视频流?

  22. 22

    如何在pygame中加载和播放视频

  23. 23

    如何在Android中创建简单的视频播放器?

  24. 24

    如何在Google Glass的WebView中播放YouTube视频

  25. 25

    如何在本机播放器中播放youtube视频以及如何下载youtube视频

  26. 26

    如何在YouTube中播放私人视频?

  27. 27

    如何在WPF中向后播放视频?

  28. 28

    如何在jQuery中播放视频并暂停播放?

  29. 29

    如何在 Qt Designer 中推广的 QVideoWidget 中播放视频?

热门标签

归档