flex加载jwplayer的解决办法

2024-01-01 19:08

本文主要是介绍flex加载jwplayer的解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天偶尔看到了这篇文章,转载一下,以备所需。之前尝试过在flex工程中加入jwplayer,以失败告终。以下转载的方法还没有亲身试验。

原文地址如下:

http://cookbooks.adobe.com/post_Embedding_JW_Player_Version_5_into_Flex-16707.html

Problem

By default JW Player Version does not support embedding into Flex application (http://developer.longtailvideo.com/trac/wiki/FlexEmbedding).

Solution

You just need to overlap original RootReference class with your own, when loading player in to your Flex application. You don't need to get JW Player source code from SVN and fix it to apply this solution, but this is one of the approach.

Detailed explanation

This is a workaroud to made Longtail FLV Player 5

(http://www.longtailvideo.com/players/jw-flv-player/), work within Adobe Flex.
This class is overlaps original class:
com.longtailvideo.jwplayer.utils.RootReference compiled in Player.
WARNING:
This class MUST be placed strictly in: com.longtailvideo.jwplayer.utils class path.
Usage example:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:com="com.*"
    layout="vertical" verticalAlign="middle" horizontalAlign="center"
    creationComplete="handleCreationComplete()">
    
  <mx:Script>
    <![CDATA[
      import com.longtailvideo.jwplayer.utils.RootReference;
      import mx.core.UIComponent;
      import mx.events.FlexEvent;


      private var _loader:Loader;
      private var _playerObject:DisplayObject;
      private var _flashVars:String;
      private var _autoStart:Boolean = true;
      private var _playerURL:String = "player.swf";


      private var _videoURL:String = "someVideo.flv";
      private var _uic:UIComponent;
      private var _jwPlayerHack:RootReference;


      protected function handleCreationComplete():void {
        // You can add Player container not only in some UIComponent but also on stage.
        _uic = UIComponent(canv.addChild (new UIComponent ()));


        _uic.width = 400;
        _uic.height = 300;


        _jwPlayerHack = new RootReference(_uic);
        
        videoSource = _videoURL;
      }


      public function set videoSource(url:String):void {
        if (!url) url = "";
        // Here you can set any FlashVars supported by player.
        // see http://developer.longtailvideo.com/trac/wiki/Player5FlashVars.
        _flashVars = "file=" + url + "&autostart=true";
        _flashVars += "&t=" + getTimer().toString();


        _loader = new Loader();
        _loader.contentLoaderInfo.addEventListener(Event.INIT, onLoadInit);


        var ldrContext:LoaderContext = new LoaderContext(false,
            ApplicationDomain.currentDomain);
        var request:URLRequest = new URLRequest(_playerURL);
        var urlVars:URLVariables = new URLVariables();
       
        urlVars.decode(_flashVars);
        request.data = urlVars;
       
        _loader.load(request, ldrContext);
      }
     
      private function onLoadInit(event:Event):void {   
        _playerObject = _loader.content as DisplayObject;
        _playerObject.addEventListener("jwplayerReady", onPlayerReady);
       
        RootReference.root = _playerObject.root;
        _uic.addChild(_loader);
      }


      private function onPlayerReady(event:*=null):void {
        _jwPlayerHack.fixMaskIssue();
      }
    ]]>
  </mx:Script>   
  
  <mx:Canvas id="canv" width="400" height="300" backgroundColor="0xffffff" />
</mx:Application>
 
  

RootReference.as:(也就是原文src.zip中的内容)


package com.longtailvideo.jwplayer.utils

{

import flash.debugger.enterDebugger;

import flash.display.DisplayObject;

import flash.display.DisplayObjectContainer;

import flash.display.MovieClip;

import flash.display.Stage;

import flash.display.StageDisplayState;

import flash.events.Event;

import flash.events.EventDispatcher;

import flash.events.FullScreenEvent;

import flash.geom.Point;

import flash.geom.Rectangle;

import flash.media.Video;

import flash.system.Capabilities;

import flash.system.Security;

import mx.core.Application;

import mx.core.UIComponent;

/**

* This is a workaroud to made Longtail FLV Player 5 (http://www.longtailvideo.com/players/jw-flv-player/), work within Adobe Flex.

* This class is overlaps original class com.longtailvideo.jwplayer.utils.RootReference compiled in Player.

* WARNING: This class MUST be placed strictly in com.longtailvideo.jwplayer.utils class path.

*

* Usage example:

* <?xml version="1.0" encoding="utf-8"?>

* <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:com="com.*"

* layout="vertical"

* verticalAlign="middle" horizontalAlign="center" 

* creationComplete="handleCreationComplete()">

*

* <mx:Script>

* <![CDATA[

* import com.longtailvideo.jwplayer.utils.RootReference;

*

* import mx.core.UIComponent;

* import mx.events.FlexEvent;

*

* private var _loader: Loader;

* private var _playerObject: DisplayObject;

* private var _flashVars: String;

* private var _autoStart: Boolean = true;

* private var _playerURL: String = "player.swf";

*

* private var _videoURL: String = "someVideo.flv";

*

* private var _uic: UIComponent;

* private var _jwPlayerHack: RootReference;

*

* protected function handleCreationComplete () : void

* {

* // You can add Player container not only in some UIComponent but also on stage.

* _uic = UIComponent( canv.addChild ( new UIComponent () ) );

*

* _uic.width = 400;

* _uic.height = 300;

*

* _jwPlayerHack = new RootReference( _uic );

*

* videoSource = _videoURL;

* }

*

* public function set videoSource( url : String ) : void

* {

* if ( ! url ) url = "";

*

* // Here you can set any FlashVars supported by player

* // see http://developer.longtailvideo.com/trac/wiki/Player5FlashVars

* _flashVars = "file=" + url + "&autostart=true";

* _flashVars += "&t=" + getTimer().toString();

*

* _loader = new Loader();

*

* _loader.contentLoaderInfo.addEventListener( Event.INIT, onLoadInit );

*

* var ldrContext: LoaderContext = new LoaderContext( false, ApplicationDomain.currentDomain );

* var request: URLRequest = new URLRequest( _playerURL );

* var urlVars: URLVariables = new URLVariables();

*

* urlVars.decode( _flashVars );

*

* request.data = urlVars;

*

* _loader.load( request, ldrContext );

* }

*

* private function onLoadInit ( event:Event ) : void

* {

* _playerObject = _loader.content as DisplayObject;

* _playerObject.addEventListener( "jwplayerReady", onPlayerReady );

*

* RootReference.root = _playerObject.root;

*

* _uic.addChild( _loader );

* }

*

* private function onPlayerReady ( event:* = null ) : void

* {

* _jwPlayerHack.fixMaskIssue();

* }

*

* ]]>

* </mx:Script>

*

* <mx:Canvas id="canv" width="400" height="300" backgroundColor="0xffffff" />

     *

* </mx:Application>

*

* @author Dmitry 'Reijii' Kochetov, Marat '7thsky' Atayev

* @version Jan 14, 2010

* @skype kodjii

*

* This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported

* @see http://creativecommons.org/licenses/by-sa/3.0/

*/

public class RootReferenceextends EventDispatcher

{

public static var root : DisplayObject;

public static var stage : RootReference;

public static var container : UIComponent;

public static var instance : RootReference;

public static var _stageInstance : Stage;

public static var _playerUI : MovieClip;

public function RootReference ( $displayObj : DisplayObject ) : void

{

if ( ! RootReference.instance )

{

RootReference.instance= this;

RootReference.container = $displayObjas UIComponent;

RootReference.stage= RootReference.instance;

try

{

Security.allowDomain("*" );

}

catch ( e : Error )

{

// This may not work in the AIR testing suite

}

if ( container.stage )

{

_stageInstance = container.stage;

_stageInstance.addEventListener( Event.ADDED, handleAdded );

}

else

{

container.addEventListener( Event.ADDED_TO_STAGE, handleAddedToStage,false, 0, true );

}

}

}

private function handleAddedToStage ( event:Event ) : void

{

container.removeEventListener( Event.ADDED_TO_STAGE, handleAddedToStage );

_stageInstance = container.stage;

_stageInstance.addEventListener( Event.ADDED, handleAdded );

}

private function handleAdded ( event:Event ) : void

{

if ( event.targetis Video )

{

enterDebugger();

}

}

public function fixMaskIssue () : void

{

var i: int;

var parent: MovieClip; 

var child: DisplayObject;

var mask: DisplayObject;

var tl: Point; 

var br: Point;

if ( ( parent = _playerUI ) !=null )

{

for ( i = 0; i < parent.numChildren; i++ )

{

if ( parent.getChildAt( i ).mask)

{

mask = parent.getChildAt( i ).mask;

break;

}

}

}

if ( mask )

{

tl = container.localToGlobal(new Point( 0, 0 ) );

br = container.localToGlobal(new Point( container.width, container.height ) );

mask.x = tl.x;

mask.y = tl.y;

mask.width = br.x - tl.x;

mask.height = br.y - tl.y;

}

}

// STAGE EMULATION ;)

public var stage : Object = {};

public function get stageWidth () : int

{

return container.width;

}

public function get stageHeight () : int

{

return container.height;

}

override public function addEventListener ( type:String, listener:Function, useCapture:Boolean =false, priority:int = 0, useWeakReference:Boolean = false ) : void

{

_stageInstance.addEventListener( type, listener, useCapture, priority, useWeakReference );

}

override public function removeEventListener ( type:String, listener:Function, useCapture:Boolean =false ) : void

{

_stageInstance.removeEventListener( type, listener, useCapture );

}

override public function hasEventListener ( type:String ) : Boolean

{

return _stageInstance.hasEventListener( type );

}

override public function willTrigger ( type:String ) : Boolean

{

return _stageInstance.willTrigger( type );

}

override public function dispatchEvent ( event:Event ) : Boolean

{

return _stageInstance.dispatchEvent( event );

}

public function addChildAt ( $child:DisplayObject, $index:int ) : DisplayObject

{

if ( $childis MovieClip )

{

_playerUI = MovieClip( $child );

}

return container.addChildAt( $child, $index );

}

public function addChild ( $child:DisplayObject ) : DisplayObject

{

return addChildAt( $child, container.numChildren ); 

}

public function removeChild ( $child:DisplayObject ) : DisplayObject

{

return container.removeChild( $child );

}

public function get numChildren () : uint

{

return container.numChildren;

}

public function get displayState () : String

{

return _stageInstance ? _stageInstance.displayState :'';

}

private var _savedParent : DisplayObjectContainer;

private var _savedLayout : String;

private var _savedWidth : Number;

private var _savedHeight : Number;

private var _savedX : Number;

private var _savedY : Number;

private var _savedIndex : Number;

private var _isLocked : Boolean = false;

public function set displayState ( $value:String ) : void

{

if ( $value == StageDisplayState.FULL_SCREEN )

{

_isLocked = false;

setFullScreen();

}

elseif ( _stageInstance.displayState == StageDisplayState.FULL_SCREEN )

{

_isLocked = true;

setNormalScreen();

}

}

private function handleFullScreen ( event:FullScreenEvent ) : void

{

if ( event.fullScreen ==false && _isLocked == false  )

{

setNormalScreen();

}

}

private function setFullScreen () : void

{

_savedWidth = container.width;

_savedHeight = container.height;

_savedLayout    = Application.application.layout;

_savedParent = container.parent;

Application.application.layout ="absolute";

_savedIndex = _savedParent.getChildIndex( container );

Application.application.addChild( _savedParent.removeChild( container ) );

_savedX = container.x;

_savedY = container.y;

container.x = 0;

container.y = 0;

_stageInstance.addEventListener( FullScreenEvent.FULL_SCREEN, handleFullScreen );

_stageInstance.fullScreenSourceRect =new Rectangle( 0, 0, Capabilities.screenResolutionX, Capabilities.screenResolutionY );

_stageInstance.displayState = StageDisplayState.FULL_SCREEN;

container.width = Capabilities.screenResolutionX;

container.height = Capabilities.screenResolutionY;

Object( RootReference.root ).redraw();

fixMaskIssue();

}

private function setNormalScreen () : void

{

_stageInstance.displayState = StageDisplayState.NORMAL;

Application.application.layout = _savedLayout;

_savedParent.addChildAt( Application.application.removeChild( container ),_savedIndex );

container.width = _savedWidth;

container.height = _savedHeight;

container.x = _savedX;

container.y = _savedY;

Object( RootReference.root ).redraw();

fixMaskIssue();

_stageInstance.removeEventListener( FullScreenEvent.FULL_SCREEN, handleFullScreen );

}

public function get scaleMode () : String

{

return _stageInstance ? _stageInstance.scaleMode :'';

}

public function set scaleMode ( $value:String ) : void

{

_stageInstance.scaleMode = $value;

}

}

}


这篇关于flex加载jwplayer的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560217

相关文章

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

笔记本电脑开机报错故障的原因及解决办法

笔记本电脑开机报错故障是指笔记本电脑开机自检时或启动操作系统前停止启动,在显示屏 出现一些错误提示的故障。   笔记本电脑开机报错故障的原因及解决办法   造成此类故障的原因一般是笔记本电脑在启动自检时,检测到硬件设备不能正常工作或在自 检通过后从硬盘启动时,出现硬盘的分区表损坏、硬盘主引导记录损坏、硬盘分区结束标志丢失 等故障,笔记本电脑出现相应的故障提示。   维修此类故障时

gazebo 已加载模型但无法显示

目录 写在前面的话问题一:robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二:通过 ros2 启动 gazebo 失败成功启动 问题三:gazebo 崩溃和无法显示模型问题四: 缺少 robot_description 等话题正确的输出 写在前面的话

adb shell 执行后台程序后断开adb后台进程被结束的解决办法

环境:Android 版本 Android8 通常让程序后台执行就是在命令 最后加上 &即可,但是在Android 8上实验发现,程序的确后台了,但是拔掉USB线再连接上发现进程已结束。不确定Android早期版本是否存在此问题。 参考网上一些Linux方法,如加nohup 仍然无效,还是会结束。看来Android adb shell 与 Linux shell 还是有一定区别。 后来在网上

JVM类的加载器及加载过程

类的加载器及加载过程 文章目录 类的加载器及加载过程类的加载过程加载:链接(验证、准备、解析):初始化: 类加载器的分类引导类加载器:BootstrapClassLoader 启动类加载器( C/C++实现,嵌套在JVM内部)自定义类加载器(所有派生于抽象类ClassLoader的类加载器)获取ClassLoader的途径 双亲委派机制(重点)判断两个Class对象是否为同一个类

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj