Search code examples
airvideo-streaminghtml5-videoblackberry-playbook

Videostreaming on Playbook


I'm trying to play a video via RTSP using Adobe Air, I have the permissions:

<action>access_internet</action>
<action>set_audio_volume</action>
<action>access_shared</action>
<action>play_audio</action>

but when I play (), it does nothing.

It's possible to do RTSP Streaming on Playbook? If not, it's possible any other kind of videostreaming? webworks? html5 video tag?

The native Youtube App preinstaled do streaming video.

Thanks in advance

here the sample code

package{
import flash.display.Sprite;
import flash.filesystem.File;
import flash.events.Event;

import qnx.events.MediaPlayerEvent;
import qnx.media.MediaPlayer;
import qnx.media.VideoDisplay;
import qnx.ui.events.MediaControlEvent;
import qnx.ui.media.*;
import qnx.dialog.AlertDialog;
import qnx.dialog.DialogSize;



/**
 * ...
 * @author Fernando Franco Giraldez
 */

// The following metadata specifies the size and properties of the canvas that
// this application should occupy on the BlackBerry PlayBook screen.
[SWF(width="1024", height="600", backgroundColor="#cccccc", frameRate="30")]

public class Main extends Sprite 
{

    private var _myPlayer:MediaPlayer;
    private var _myVD:VideoDisplay;
    private var _myMediaControl:MediaControl;
    private var alert:AlertDialog;

    public function Main()
    {
        try {
        initializeUI();
        initializePlayer();  
        }catch (ex:Error) {
            showAlertDialog("Initialize error", ex.name + " - " + ex.message + "\n"+ex.getStackTrace());
        }
    }

    private function initializePlayer():void
    {

        _myVD = new VideoDisplay;
        _myVD.setPosition(1024/2 - 800/2, 600/2 - 480/2);
        _myVD.setSize(800, 480);
        _myVD.backgroundColor = 0xFFFFFF;
        addChild(_myVD);

        _myPlayer = new MediaPlayer();
        _myPlayer.addEventListener(MediaPlayerEvent.INFO_CHANGE, infoChange);        

        var file:File = File.userDirectory.resolvePath("shared/videos/Wildlife.wmv");
                    //_myPlayer.url = file.nativePath;   //using this i can see the video  
        _myPlayer.url = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; 
        //_myPlayer.url = "rtsp://stream.the.sk/live/joj/joj-hm.3gp"
                    // but using any of internet urls i can`t see anything
        _myPlayer.videoDisplay = _myVD;
        _myPlayer.prepare();
        showAlertDialog("Preparando video", "acabo de meteer: " + _myPlayer.url);

    }

    private function initializeUI():void
    {

        _myMediaControl = new MediaControl();
        _myMediaControl.width = 900;
        _myMediaControl.x = Math.round((stage.stageWidth - _myMediaControl.width) / 2);
        _myMediaControl.y = stage.stageHeight - _myMediaControl.height;

        _myMediaControl.setOption( MediaControlOption.VOLUME, true );
        _myMediaControl.setOption( MediaControlOption.PLAY_PAUSE, true );
        _myMediaControl.setOption( MediaControlOption.NEXT, true );
        _myMediaControl.setOption( MediaControlOption.PREVIOUS, true );
        _myMediaControl.setOption( MediaControlOption.STOP, true );
        _myMediaControl.setOption( MediaControlOption.SEEKBAR, true );
        _myMediaControl.setOption( MediaControlOption.DURATION, true );
        _myMediaControl.setOption( MediaControlOption.POSITION, true );
        _myMediaControl.setOption( MediaControlOption.BACKGROUND, true);
        _myMediaControl.setProperty( MediaControlProperty.VOLUME, 80 );

        _myMediaControl.addEventListener( MediaControlEvent.STATE_CHANGE, mediaControlStateChange );
        _myMediaControl.addEventListener( MediaControlEvent.PROPERTY_CHANGE, mediaControlPropChange );

        addChild(_myMediaControl);            

    }

    private function infoChange(event:MediaPlayerEvent):void {

        if (event.what.position) {
            _myMediaControl.setProperty(MediaControlProperty.POSITION, _myPlayer.position);
        }
        if (event.what.duration) {
            _myMediaControl.setProperty(MediaControlProperty.DURATION, _myPlayer.duration);
        }
        if (event.what.state) {
            _myMediaControl.setState(_myPlayer.isPlaying ? MediaControlState.PLAY : MediaControlState.PAUSE);
        }        


    }

    private function mediaControlStateChange(mediaControlEvent:MediaControlEvent):void
    {
        var state:String = _myMediaControl.getState();

        switch( state )
        {
            case MediaControlState.PLAY:
                if (!_myPlayer.isPlaying) 
                {
                    try {                           
                        _myPlayer.play();
                        showAlertDialog("Play", "play detectado");
                    }catch (ex:Error) {
                        showAlertDialog("play() error", ex.name + " - " + ex.message + "\n"+ex.getStackTrace());
                    }
                } 
                else 
                {
                    _myPlayer.speed = 1000;
                }
                break;
            case MediaControlState.PAUSE:
                _myPlayer.pause();
                break;
            case MediaControlState.STOP:
                _myPlayer.stop();
                break;
            case MediaControlState.SEEK_START:
                _myPlayer.pause();
                break;
            case MediaControlState.SEEK_END:
                _myPlayer.play();
                break;
            default:
                break;
        }
    }

    private function mediaControlPropChange(event:MediaControlEvent):void {

        switch (event.property) {

            case MediaControlProperty.POSITION:
            {
                _myPlayer.seek(uint( _myMediaControl.getProperty(MediaControlProperty.POSITION)));
            }
                break;
            case MediaControlProperty.DURATION:
                break;
            case MediaControlProperty.FULLSCREEN:
                break;
            case MediaControlProperty.VOLUME:
                break;
            default:
                break;
        }
    }

    private function showAlertDialog(title:String,message:String):void
    {
        alert = new AlertDialog();
        alert.title = title;
        alert.message = message;
        alert.addButton("OK");
        alert.addButton("CANCEL");
        alert.dialogSize= DialogSize.SIZE_MEDIUM;
        alert.addEventListener(Event.SELECT, alertButtonClicked); 
        alert.show();
    }

    private function alertButtonClicked(event:Event):void
    {
        trace("Button Clicked Index: " + event.target.selectedIndex);
        trace("Button properties Object"+event.target.getItemAt(event.target.selectedIndex));
    }

}

}


Solution

  • It seems that RTSP wasnt supported in 6/2011 (a year ago). From the release notes on the updates of the NDK. The native Youtube App may not be using RSTP for streaming (there are other ways to stream video). Check out this link for more information.

    But on the Webworks side, Yes. The Html5 video tag is fully implemented. You can find out more information here: https://bdsc.webapps.blackberry.com/html5/apis/HTMLVideoElement.html it will use the built in video player. Just note that this will not work on BB10.

    Update: The HTML5 video tag is now also supported on the BB10 platform.