1

我真的一点也不熟悉 Action Script 3,但我熟悉其他语言。

我希望有人能帮助我。

我正在尝试对 JWplayer 进行修改,以便通过 PHP 脚本检索 rtmp 流,而不是在 HTML 中提供它。

我目前拥有的代码如下:

    function useData(event:Event):void {
            var data:String = event.target.data.toString();

        }

        /** Load content. **/
        override public function load(itm:PlaylistItem):void {
            _item = itm;
            _position = 0;

            var loader:URLLoader = new URLLoader();
            loader.addEventListener(Event.COMPLETE, useData);
            loader.load(new URLRequest("http://192.168.0.12/phpauth/play1.php"));

            // Set Video or StageVideo
if(!_video) { 
                _video = new Video(320, 240);
                _video.smoothing = true;
                _video.addEventListener('renderState', renderHandler);
                // Use stageVideo when available
                if (_stageEnabled && RootReference.stage['stageVideos'].length > 0) {
                    _stage = RootReference.stage['stageVideos'][0];
                    _stage.viewPort = new Rectangle(0,0,320,240);
                    _stage.addEventListener('renderState', renderHandler);
                }
                attachNetStream(_stream);
            }
            // Load either file, streamer or manifest
            if (_item.file.substr(0,4) == 'rtmp') {
                // Split application and stream
                var definst:Number = _item.file.indexOf('_definst_');

在加载函数中,要播放的文件名保存在 _item.file 中。我正在尝试调用 php 脚本,然后覆盖 _item.file 中的值。我已经确认正在调用 php,但我不知道如何将 useData 函数中的数据字符串中的数据获取到 _item.file 字符串中。

任何帮助都将不胜感激 - 我怀疑这是一个简单的帮助,但我缺乏 AS3 知识使其变得非常困难。

谢谢,

4

2 回答 2

1

如果你从 PHP 返回一个简单的字符串,你应该可以使用

event.target.data;

例如来自 PHP... echo "hello";

var data:String = event.target.data

您可以尝试跟踪响应以确保您从 PHP 中获得了一些反馈。您可以在 IDE 中对此进行测试,也可以安装 Flash Player 浏览器插件的调试版本。

trace("Response from PHP: "+event.target.data);

_item.file = event.target.data;
trace("_item.file: "+_item.file);
于 2013-09-07T12:26:20.110 回答
1

您的问题基本上是关于如何访问事件处理程序中的局部变量。一种快速而肮脏的方法是将匿名函数用作处理程序,例如:

loader.addEventListener(Event.COMPLETE, function(event:Event):void {
    var data:String = event.target.data.toString();
    _item.file = data;
});

load这种方法会起作用,因为这个匿名函数可以按原样访问函数内部的局部变量。但是,您需要注意匿名函数使用的变量与调用函数使用的完全一样。因此,假设load函数中有一个循环,并且循环_item的每次迭代都会发生变化。对于这种情况,当调用负载处理程序时,它_item也将更改为最后分配给的对象_item

一个更清洁和面向对象的方法可以是有一个处理程序类,如:

package {
public class LoadHandler {
    private var _item:PlaylistItem;

    public function LoadHandler(item:PlaylistItem) {
        _item = item;
    }

    public function loadHandler(event:Event):void {
        var data:String = event.target.data.toString();
        _item.file = data;
    }
}

然后有loader.addEventListener(Event.COMPLETE, (new LoadHandler(_item)).loadHandler). 希望有帮助。顺便说一句,LoadHandler可以更通用地获取要使用的对象数组和回调函数。loadHandler函数,然后可以使用该对象数组调用回调函数。

于 2013-09-07T13:21:08.713 回答