Version 18 (modified by nenko, 16 years ago) (diff) |
---|
Analysis
Overview
The media engine is responsible for rendering audio and video. Write a module that implements the video and audio interfaces found in org.sophie2.main.media.fobs.
Audio should play regardless of whether it is being used by a scene or not. Video does not render directly to the screen. Instead the frame should be grabbed from the Player in order for the scene to display it.
It seems as if JMF is a good place to start for implementing the engine. Start by looking at:
http://java.sun.com/javase/technologies/desktop/media/jmf/reference/faqs/index.html#what
You will also create an extension point that wraps the class and provides a mechanism for the scene to get the audio or video handler.
Task requirements
- Write a module for media playback
- Start with JMF
- Expose an extension point for access to the handlers
- Implement the Interface found in org.sophie2.main.media.fobs
- Force the scene to repaint on playing. The grabbing of the frame should happen by equal intervals.
Task result
The result of this task is source code.
Implementation idea
- Note that JMF can only do mp3 on windows, so we need to figure out what to do about this because supporting mp3 is important for other platforms as well.
Related
How to demo
- Insert a video frame and watch the video.
- It should play smoothly.
Design
The implementation so far has the following design:
- there is a module named - org.sophie2.base.media, which defines the model for the media and two extension points - one for Video and one for Audio
- MediaInfo is the class which holds meta data for the media
- MediaState describes the current state of the media - is it playing, what is the volume, etc.
- MediaSource defines the source for the media - is has an URL and media data which is binary *there is a module named - org.sophie2.main.media.fobs, which add two extension for the presently described extension points - one for Video and one for Audio. The engine used is JMF
Since repainting the scene by grabbing the current frame from the player should be forced we should add a Timer which will repaint the SimpleSceneVisual's swing component if there is a video content in this scene and it's playing. The timer instance will reside in SimpleSceneVisual because it needs access to the swingComponent() property. The Timer instance will be in SimpleSceneVisual and it will update (force redraw) the scene 15 times in a second. The update will happen only if there's a runnig video. To understand if there's a running video use the following approach :
- Take the scene elements
- If there's a MediaSceneElement take the media state
- If the media is playing the scene sould be updated
This is a link to a reference video: http://www.sophie2.org/trac/browser/trunk/sophie2-platform/modules/org.sophie2.base.media/src/test/resources/demo.avi
How to demo is described in the Analysis section...you should have an implementation though
Implementation
Implementation is done according to the desing. The timer now reside in SimpleSceneVisual class as a resource property.
Testing
Comments
Alex, http://java.sun.com/javase/technologies/desktop/media/jmf/reference/faqs/index.html#what might be a good place to start? - Steve
desc("making the main engine better ")
Is this task about rendering media, such as video and audio? How should it work with scenes and content objects?
Publish extension for playing video handler and audio handler
org.sophie2.main.media.fobs is the interface for the engine
audio should play even if grab frames is not called
wrap jmf class in an extension and publish it
Attachments
- SimpleSceneRedrawVideoDemoTest.java (3.5 KB) - added by nenko 16 years ago.
-
MEDIA_ENGINE_IMPL_MAIN_R0-28.04.2009.patch
(8.7 KB) -
added by nenko 16 years ago.
Implementation patch
- MEDIA_ENGINE_IMPL_MAIN_R0-28.04.2009-fixed-test.patch (8.5 KB) - added by nenko 16 years ago.