92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
from panda3d.core import *
|
||
|
# Tell Panda3D to use OpenAL, not FMOD
|
||
|
loadPrcFileData("", "audio-library-name p3openal_audio")
|
||
|
|
||
|
from direct.showbase.DirectObject import DirectObject
|
||
|
from direct.gui.OnscreenText import OnscreenText
|
||
|
from direct.showbase.ShowBase import ShowBase
|
||
|
|
||
|
# Function to put instructions on the screen.
|
||
|
def addInstructions(pos, msg):
|
||
|
return OnscreenText(text=msg, style=1, fg=(0, 0, 0, 1), shadow=(1, 1, 1, 1),
|
||
|
parent=base.a2dTopLeft, align=TextNode.ALeft,
|
||
|
pos=(0.08, -pos - 0.04), scale=.06)
|
||
|
|
||
|
# Function to put title on the screen.
|
||
|
def addTitle(text):
|
||
|
return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08,
|
||
|
parent=base.a2dBottomRight, align=TextNode.ARight,
|
||
|
fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1))
|
||
|
|
||
|
|
||
|
class MediaPlayer(ShowBase):
|
||
|
|
||
|
def __init__(self, media_file):
|
||
|
# Initialize the ShowBase class from which we inherit, which will
|
||
|
# create a window and set up everything we need for rendering into it.
|
||
|
ShowBase.__init__(self)
|
||
|
|
||
|
self.title = addTitle("Panda3D: Tutorial - Media Player")
|
||
|
self.inst1 = addInstructions(0.06, "P: Play/Pause")
|
||
|
self.inst2 = addInstructions(0.12, "S: Stop and Rewind")
|
||
|
self.inst3 = addInstructions(0.18,
|
||
|
"M: Slow Motion / Normal Motion toggle")
|
||
|
|
||
|
# Load the texture. We could use loader.loadTexture for this,
|
||
|
# but we want to make sure we get a MovieTexture, since it
|
||
|
# implements synchronizeTo.
|
||
|
self.tex = MovieTexture("name")
|
||
|
assert self.tex.read(media_file), "Failed to load video!"
|
||
|
|
||
|
# Set up a fullscreen card to set the video texture on.
|
||
|
cm = CardMaker("My Fullscreen Card")
|
||
|
cm.setFrameFullscreenQuad()
|
||
|
|
||
|
# Tell the CardMaker to create texture coordinates that take into
|
||
|
# account the padding region of the texture.
|
||
|
cm.setUvRange(self.tex)
|
||
|
|
||
|
# Now place the card in the scene graph and apply the texture to it.
|
||
|
card = NodePath(cm.generate())
|
||
|
card.reparentTo(self.render2d)
|
||
|
card.setTexture(self.tex)
|
||
|
|
||
|
self.sound = loader.loadSfx(media_file)
|
||
|
# Synchronize the video to the sound.
|
||
|
self.tex.synchronizeTo(self.sound)
|
||
|
|
||
|
self.accept('p', self.playpause)
|
||
|
self.accept('P', self.playpause)
|
||
|
self.accept('s', self.stopsound)
|
||
|
self.accept('S', self.stopsound)
|
||
|
self.accept('m', self.fastforward)
|
||
|
self.accept('M', self.fastforward)
|
||
|
|
||
|
def stopsound(self):
|
||
|
self.sound.stop()
|
||
|
self.sound.setPlayRate(1.0)
|
||
|
|
||
|
def fastforward(self):
|
||
|
if self.sound.status() == AudioSound.PLAYING:
|
||
|
t = self.sound.getTime()
|
||
|
self.sound.stop()
|
||
|
if self.sound.getPlayRate() == 1.0:
|
||
|
self.sound.setPlayRate(0.5)
|
||
|
else:
|
||
|
self.sound.setPlayRate(1.0)
|
||
|
self.sound.setTime(t)
|
||
|
self.sound.play()
|
||
|
|
||
|
def playpause(self):
|
||
|
if self.sound.status() == AudioSound.PLAYING:
|
||
|
t = self.sound.getTime()
|
||
|
self.sound.stop()
|
||
|
self.sound.setTime(t)
|
||
|
else:
|
||
|
self.sound.play()
|
||
|
|
||
|
player = MediaPlayer("PandaSneezes.ogv")
|
||
|
player.run()
|