Pygame 播放视频【movie模块已被弃用】

使用Pygame播放视频

目录

1. 快捷使用
2. 问题&原因
3. 其它方式
4. 总结

一、快捷使用

from moviepy.editor import *
import pygame

pygame.display.set_caption('Hello World!')

clip = VideoFileClip('生.flv')
clip.preview()

pygame.quit()

效果如下,播放完视频后,它会自动关窗口:
在这里插入图片描述
参考链接:How can I play a mp4 movie using Moviepy and Pygame

二、问题&原因

1.在 stackoverflow 上找到的问题和原因,翻译后贴在这里:

问题1:
pygame模块消失了
我目前正在使用RPi 3B(最新的Raspbian Jessie)进行一个涉及播放简短.mp4文件的小项目。 由于Pygame似乎支持播放.mpg文件,因此我将视频转换为该格式。

当我尝试导入电影模块时,我得到常见的python导入错误:

Traceback (most recent call last):
    File "film_app.py", line 3, in <module>
       import pygame.movie
ImportError: No module named movie

经过一些研究,我认为其他人有与此处描述的相同的问题。我真的不明白是否有解决方案,或者我在RPi上有什么替代方案。 Pygame,python和Raspbian都是最新的。

回答1:
movie不是pygame的子包
像这样使用它:

movie = pygame.movie.Movie("file.mpg")

但是,请注意:
movie api已被弃用,你的pygame很可能不会包含任何代码。这段代码将仅仅抛出 NotImplementedError 异常。悲惨的是,你再也不能像这样使用 movie 模块了。在这里,Lenard Lindstrom 解释说:

        “虽然没有适当的记录,pygame.movi​​e模块已经被弃用了一段时间,并且默认情况下不再被构建。使用ffmpeg将视频文件转换为MPEG1的文档说明已经过时了。我构建的movie模块已经被构建并经过测试32位Linux Mint 17.1(Ubuntu 14.04.2 LTS,Trusty Tahr)并使用avconv(ffmpeg的一个分支)在从MPEG4转换的电影上测试它; pygame出现了故障。另请注意,pygame.movi​​e在Windows下存在问题。
        基于ffmpeg的更新的实验性pygame._movie模块在Linux上从未为我工作过;它会锁定。此外,libav现在比Linux上的ffmpeg更受欢迎。此外,它依赖于SDL覆盖,它会在SDL2中消失。
作为旁注,pygame.examples.movi​​eplayer被重新用于使用pygame._movie而不是pygame.movi​​e。这一变化没有被记录。
        我喜欢在Pygame中支持movie的想法。但pygame.movi​​e使用过时的smpeg库,而pygame._movie从未正常工作过。也许可以根据现有的命令行电影播放器​​程序编写另一个movie模块。“

参考链接:Pygame.movie missing

问题2:
作为我的第一个使用pygame和Python 3.3的项目,我一直在制作一个简单的塔防游戏。几乎完成了所有这一切,但我想添加一个短的视频作为游戏的介绍。所以,我在网上查了一下,发现有这个目的的pygame.movi​​e模块,并开始尝试使用它。

在阅读了有关使用之后,我认为我正确地使用了模块(并且我确保将文件转换为MPEG1)。当我试图运行代码时,我得到一个错误,表明没有名为“pygame.movi​​e”的模块。我尝试用import语句“手动”导入它,但仍然没有出现运气。

我从这里的帖子中读到:
http://python-forum.org/viewtopic.php?t=10625&p=13394(作者:metulburr»Tue Jan 21,2014 1:01 pm-

我看到他在那里有一个相同的错误信息。

我想知道是否有人可以解释一下,或者至少指出我对这里可能出错的解释。是不是新的Python不再支持它?或者我错过了什么。

此外,如果你知道pygame.movi​​e不可用的任何好的选择,我将不胜感激!

此错误消息实际上来自上面链接的站点,而不是来自我的代码。但错误信息实际上是相同的。 /////////////////////////////////////////////////

test3.py:10: RuntimeWarning: use movie: No module named 'pygame.movie'
(ImportError: No module named 'pygame.movie')
  movie = pg.movie.Movie(filename)
Traceback (most recent call last):
  File "test3.py", line 10, in <module>
    movie = pg.movie.Movie(filename)
  File "/usr/lib/python3.3/site-packages/pygame/__init__.py", line 102, in __getattr__
    raise NotImplementedError(MissingPygameModule)
NotImplementedError: movie module not available
(ImportError: No module named 'pygame.movie') 

回答2:

Pygame的movie模块是非常实验性/ 初级的。 我在Mac上得到了同样的错误,据我所知,这是因为Mac平台没有实现Movie模块。

我一直在为Pygame寻找视频/电影播放解决方案,特别是那些不需要将视频转换为MPEG-1格式的解决方案。 似乎唯一的方法是使用其他视频播放器(pyglet等),然后将视频播放器中的像素复制到Pygame的surface表面上。 (这对我们来说没问题,因为我们只需要视频,而不是音频。我不确定它如何与音频配合使用。)

参考链接:PyGame/Python 3.3 - Video Playback

2.在Pygame官网上的 What’s New 上能找到的信息
[HG 3433:ea3b3bb8714a] Sep 07, 2015
    remove some overlooked movie files
[HG 3421:e6a646891264] Jul 02, 2015
    Remove Pygame's neglected, and broken, movie support: resolve Issue #238

参考链接:What’s New

三、其它方式

可直接参考:How do you play videos in pygame 1.9.5 on windows 10

代码:

1.下面代码直接在屏幕上显示任何流(stream)窗口必须与流的大小相同。我不知道为什么,但我必须在显示之前转换图像。

import pygame
import cv2

# --- local (built-in) camera ---
#stream = 0

# --- local file ---
#stream = '2019-03-26_08-43-15.mkv'

# --- http stream ---
# doesn't work any more
#stream = 'http://media.dumpert.nl/tablet/9f7c6290_Verstappen_vs._Rosberg_with_Horner_Smile___Streamable.mp4.mp4.mp4'

# --- rtsp stream ---
#stream = 'rtsp://streaming1.osu.edu/media2/ufsap/ufsap.mov'

# --- rtmp stream ---
# Big Buck Bunny
stream = 'rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4'

# open stream
cap = cv2.VideoCapture(stream)

# read one frame and check if there was no problem
ret, img = cap.read()
if not ret:
    print("Can't read stream")
    #exit()

# transpose/rotate frame 
#img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
img = cv2.transpose(img)

# display its width, height, color_depth
print('shape:', img.shape)

pygame.init()

# create window with the same size as frame
screen = pygame.display.set_mode((img.shape[0], img.shape[1]))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # read one frame and check if there was no problem
    ret, img = cap.read()
    if not ret:
        running = False
        break
    else:
        # transpose/rotate frame
        #img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
        #img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
        img = cv2.transpose(img)

        # blit directly on screen         
        pygame.surfarray.blit_array(screen, img)

    pygame.display.flip()

pygame.quit()

2.下面这段代码使用Surface从流中获取帧,因此窗口可能具有不同的大小。

import pygame
import cv2

# --- local (built-in) camera ---
#stream = 0

# --- local file ---
#stream = '2019-03-26_08-43-15.mkv'

# --- http stream ---
# doesn't work any more
#stream = 'http://media.dumpert.nl/tablet/9f7c6290_Verstappen_vs._Rosberg_with_Horner_Smile___Streamable.mp4.mp4.mp4'

# --- rtsp stream ---
#stream = 'rtsp://streaming1.osu.edu/media2/ufsap/ufsap.mov'

# --- rtmp stream ---
# Big Buck Bunny
stream = 'rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4'

cap = cv2.VideoCapture(stream)

ret, img = cap.read()
if not ret:
    print("Can't read stream")
    #exit()

#img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
img = cv2.transpose(img)
print('shape:', img.shape)

pygame.init()

screen = pygame.display.set_mode((800, 600))
surface = pygame.surface.Surface((img.shape[0], img.shape[1]))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    ret, img = cap.read()
    if not ret:
        running = False
        break
    else:
        #img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
        #img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
        img = cv2.transpose(img)

        pygame.surfarray.blit_array(surface, img)
        screen.blit(surface, (0,0))

    pygame.display.flip()

pygame.quit()

代码经博主测试,都是可以运行的,源码里面的地址播放时容易卡顿,可自行更换。

四、总结

主要简单地解决了Pygame中播放视频的问题,想不到网上都是movie模块的使用,没办法使用。通过 Search-Fu 成功找到了类似解释,挺好的。emmmm… 有空了解一下 rtmp。

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/89425249