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:
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.movie模块已经被弃用了一段时间,并且默认情况下不再被构建。使用ffmpeg将视频文件转换为MPEG1的文档说明已经过时了。我构建的movie模块已经被构建并经过测试32位Linux Mint 17.1(Ubuntu 14.04.2 LTS,Trusty Tahr)并使用avconv(ffmpeg的一个分支)在从MPEG4转换的电影上测试它; pygame出现了故障。另请注意,pygame.movie在Windows下存在问题。
基于ffmpeg的更新的实验性pygame._movie模块在Linux上从未为我工作过;它会锁定。此外,libav现在比Linux上的ffmpeg更受欢迎。此外,它依赖于SDL覆盖,它会在SDL2中消失。
作为旁注,pygame.examples.movieplayer被重新用于使用pygame._movie而不是pygame.movie。这一变化没有被记录。
我喜欢在Pygame中支持movie的想法。但pygame.movie使用过时的smpeg库,而pygame._movie从未正常工作过。也许可以根据现有的命令行电影播放器程序编写另一个movie模块。“
参考链接:Pygame.movie missing
问题2:
作为我的第一个使用pygame和Python 3.3的项目,我一直在制作一个简单的塔防游戏。几乎完成了所有这一切,但我想添加一个短的视频作为游戏的介绍。所以,我在网上查了一下,发现有这个目的的pygame.movie模块,并开始尝试使用它。
在阅读了有关使用之后,我认为我正确地使用了模块(并且我确保将文件转换为MPEG1)。当我试图运行代码时,我得到一个错误,表明没有名为“pygame.movie”的模块。我尝试用import语句“手动”导入它,但仍然没有出现运气。
我从这里的帖子中读到:
http://python-forum.org/viewtopic.php?t=10625&p=13394(作者:metulburr»Tue Jan 21,2014 1:01 pm-
)
我看到他在那里有一个相同的错误信息。
我想知道是否有人可以解释一下,或者至少指出我对这里可能出错的解释。是不是新的Python不再支持它?或者我错过了什么。
此外,如果你知道pygame.movie不可用的任何好的选择,我将不胜感激!
此错误消息实际上来自上面链接的站点,而不是来自我的代码。但错误信息实际上是相同的。 /////////////////////////////////////////////////
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
[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.