一个使用sdk4.0的Flv播放器,主要链接RTMP协议,使用red5容器装载flv视频。
下面附上我的代码,flvPlayer视频播放器支持回调js中的函数,获取链接的地址,例如rtmp://localhost/oflaDemo/,再获取视频的名称,可以传入多个视频,用“*”分隔视频名称。
FlvPlayer.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:controls="com.player.*"
width="500"
height="400"
applicationComplete="init()">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
//difine the player listener
public static var instance:FlvEvent=FlvEvent.getInstance();
public var flvPlayer:FlvPlayer=new FlvPlayer();
private function init():void
{
//init film array.
flvPlayer.initPlayer();
//init videoPlayer's sourse.
curFlvHandler();
//定义视频播放事件监听
instance.addEventListener("VideoPlay", playVideoHandler);
}
/**
* play the video
*
*/
private function playVideoHandler(event:Event):void
{
var myVideo:SharedObject;
//将播放头置于视频开始处
myVideo=SharedObject.getLocal("videoCookie");
var vName:String=myVideo.data.vName;
//播放选中的视频
film.source=flvPlayer.filmSource + vName;
}
//读取文件
private function curFlvHandler():void
{
//获取流媒体文件名
var vName:String=flvPlayer.flvPartArr[flvPlayer.curFlvId]; //event.result.videoConfig.item.filmName;
//获取流媒体完整路径
film.source=flvPlayer.filmSource + vName;
}
protected function film_doubleClickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
flvPlayer.fullScreenButton_clickHandler(event);
}
protected function film_playheadUpdateHandler(event:Event):void
{
if(film.totalTime==film.playheadTime || film.totalTimeDisplay.text==film.playheadTimeDisplay.text)
{
flvPlayer.curFlvId++;
if(flvPlayer.curFlvId<flvPlayer.flvPartArr.length)
{
var myVideo:SharedObject;
//将播放头置于视频开始处
myVideo=SharedObject.getLocal("videoCookie");
//将视频的文件名称,存放到共享文件里
myVideo.data.vName=flvPlayer.flvPartArr[flvPlayer.curFlvId]; //"DarkKnight.flv";
//一定要先存放VCODE到共享对象里,再分发事件
instance.dispatchEvent(new Event("VideoPlay"));
}
}
}
]]>
</fx:Script>
<controls:FlvPlayer doubleClickEnabled="true" doubleClick="film_doubleClickHandler(event)"
width="500" height="396" id="film" autoPlay="true" playheadUpdate="film_playheadUpdateHandler(event)"
/>
</s:Application>
FlvEvent.as:
package
{
import flash.events.EventDispatcher;
public class FlvEvent extends EventDispatcher
{
// 静态常量,定义事件类型
public static const VidoPlay:String="VideoPlay";
public static const LoopPlay:String="LoopPlay";
// 静态实例
private static var _instance:FlvEvent;
public static function getInstance():FlvEvent
{
if(_instance==null)
_instance=new FlvEvent();
return _instance;
}
}
}
FlvPlayer.as
package com.player
{
import com.player.fxvideo.*;
import flash.events.Event;
import flash.external.ExternalInterface;
import spark.components.VideoPlayer;
public class FlvPlayer extends VideoPlayer
{
//视频源路径
public var filmSource:String="rtmp://192.168.100.166/oflaDemo/";
//video name string
private var flvNameStr:String="";
//视频名称
public var filmName:String="";//IronMan.flv
//flv 视频节的数据
public var flvPartArr:Array;
//当前视频的id
public var curFlvId:Number = 0;
//视频节的X位置
private var flvPartX:Number = 5;
//视频节的Y位置
private var flvPartY:Number = 401;
/**
* function structior
*
*/
public function FlvPlayer()
{
super();
}
public function initPlayer():void
{
//get the value of rtmp url from js file.
getRtmpUrl();
//get the value of flv name from js file.
getFlvName();
//init the flv Array.
initFlvPart();
//init tool tip
//initToolTip();
}
public function stop_onClick():void
{
stop();
}
public function initToolTip():void
{
fullScreenButton.toolTip="全屏";
}
/**
* init flv video part
*/
private function initFlvPart():void
{
//var flvNameStr:String = "马王堆考古纪实.flv$IronMan.flv$DarkKnight.flv$youku.flv";
flvPartArr = flvNameStr.split("*");
}
// /**
// * get the value of label's x
// */
// private function getLabelX(num:Number):Number{
// var tmp_i:Number = num%4;
//
// var tmp_x:Number = 5 + tmp_i*(500/4);
//
// return tmp_x;
// }
//
// /**
// * get the value of lable's y
// */
// private function getLabelY(num:Number):Number{
// var tmp_i:Number = num/4;
//
// var tmp_y:Number = 401 + tmp_i*30;
//
// return tmp_y;
// }
private function getRtmpUrl():void
{
filmSource=ExternalInterface.call("getServerHttpUrl");
if(filmSource==null || filmSource == "")return;
}
private function getFlvName():void
{
flvNameStr=ExternalInterface.call("getVideoName");
if(flvNameStr==null || flvNameStr == "")return;
}
public function fullScreenButton_clickHandler(event:Event)
{
}
}
}