A Flash Developer Resource Site

Results 1 to 2 of 2

Thread: Extending AS2 FLVPlayback

  1. #1
    Senior Member
    Join Date
    Jan 2001
    Posts
    285

    Extending AS2 FLVPlayback

    Hi,

    I'm diving back into AS2 to help a vendor. I've never extended a component class in AS2, and I'm having problems with it now.

    Here's my class file:

    Actionscript Code:
    import mx.video.FLVPlayback;
    import mx.video.*;
    class AkamaiFLVPlayback extends FLVPlayback{
       
        public function AkamaiFLVPlayback()
        {  
            super()

        }  
    }
    Here's how I'm trying to instantiate it from the FLA:
    Actionscript Code:
    import AkamaiFLVPlayback

    var g = new AkamaiFLVPlayback()
    this.attachMovie(g,myVid,1)
    g.contentPath = "http://phpmotion.fahiec.com/uploads/EY0ttuJbAIerDIpOdDch.flv"

    Now this DOES NOT WORK... at all. I can see that the super class FLVPlayback is creating variables, but it's not loading to the stage or initializing.

    Any help will be greatly appreciated.

    enjoy,

    -tutash

  2. #2
    Senior Member
    Join Date
    Jan 2001
    Posts
    285

    got it

    Now remember, this just fixes my problem with connecting to Akamai (it was a security issue). Your mileage may vary.

    The AS file:

    Actionscript Code:
    class ExtendedNCManager extends NCManager implements INCManager {
        private var xml:XML;
        private var akamaiHost:String;
        private var isAkamai:Boolean
        private var _akamaiToken:String
        private var _serverNameAkamai:String
        public function connectToURL(url:String):Boolean {
            //trace("----------------KAPLAN NC MANAGER----------------")
            initOtherInfo();
            _contentPath = url;
            if (_contentPath == null || _contentPath == undefined || _contentPath == "") {
                throw new VideoError(VideoError.INVALID_CONTENT_PATH);
            }
            // parse URL to determine what to do with it                        
            var parseResults:Object = parseURL(_contentPath);
            if (parseResults.streamName == undefined || parseResults.streamName == "") {
                throw new VideoError(VideoError.INVALID_CONTENT_PATH, url);
            }
            // connect to either rtmp or http or download and parse smil                        
            if (parseResults.isRTMP) {
                // Check to see if we are dealing with an Akamai URL
                isAkamai = isAkamaiStreamingURL(url)
                if (isAkamai) {
                    // Check to see if that serverName has already been processed
                    if (akamaiHost == parseResults.serverName) {
                        _streamName = _contentPath.slice(_contentPath.indexOf("ondemand/")+9, _contentPath.length);
                        if (_streamName.slice(-4).toLowerCase() == ".flv") {
                            _streamName = _streamName.slice(0, -4);
                        }
                        // if this hostname is already in use then reuse the existing connection      
                        return true;
                    } else {
                        try {
                            xml = new XML();
                            xml.ignoreWhite = true;
                            xml.onLoad = Delegate.create(this, this.xmlOnLoad);
                            xml.load("http://"+parseResults.serverName+"/fcs/ident");

                            return false;
                        } catch (err:Error) {
                            _nc = undefined;
                            _owner.ncConnected();
                            throw err;
                        }
                    }
                } else {
                    var canReuse:Boolean = canReuseOldConnection(parseResults);
                    _isRTMP = true;
                    _protocol = parseResults.protocol;
                    _streamName = parseResults.streamName;
                    _serverName = parseResults.serverName;
                    _wrappedURL = parseResults.wrappedURL;
                    _portNumber = parseResults.portNumber;
                    _appName = parseResults.appName;
                    if (_appName == undefined || _appName == "" || _streamName == undefined || _streamName == "") {
                        throw new VideoError(VideoError.INVALID_CONTENT_PATH, url);
                    }
                    _autoSenseBW = (_streamName.indexOf(",")>=0);
                    return (canReuse || connectRTMP());
                }
            } else {
                if (parseResults.streamName.toLowerCase().indexOf(".flv") != -1) {
                    var canReuse:Boolean = canReuseOldConnection(parseResults);
                    _isRTMP = false;
                    _streamName = parseResults.streamName;
                    return (canReuse || connectHTTP());
                }
                if (parseResults.streamName.indexOf("/fms/fpad")>=0) {
                    try {
                        return connectFPAD(parseResults.streamName);
                    } catch (err:Error) {
                        //
                    }
                }
                _smilMgr = new SMILManager(this);
                return _smilMgr.connectXML(parseResults.streamName);
            }
        }
        private function xmlOnLoad(success:Boolean) {
            try {
                if (!success) {
                    _nc = undefined;
                    _owner.ncConnected();
                } else {
                    var ipNode = xml.firstChild.firstChild;
                    if (ipNode.nodeName != "ip") {
                        throw new VideoError(VideoError.INVALID_XML, "URL: \""+_contentPath+"\" did not return a valid XML when queried using IDENT");
                    } else {
                        var parseResults:Object = parseURL(_contentPath);
                        //
                        _serverNameAkamai = _contentPath.split("://")[1].split("?")[0].split("ondemand")[0]
                        _akamaiToken = "ondemand?auth=" + _contentPath.split("auth=")[1]
                        //
                        akamaiHost = parseResults.serverName;
                        _isRTMP = true;
                        _protocol = parseResults.protocol;
                        _streamName = parseResults.streamName;
                        _appName = parseResults.appName;
                        _streamName = _contentPath.slice(_contentPath.indexOf("ondemand/")+9, _contentPath.length);
                        _serverName = ipNode.firstChild.toString();
                        _wrappedURL = parseResults.wrappedURL;
                        _portNumber = parseResults.portNumber;
                        _appName = "ondemand?_fcs_vhost="+parseResults.serverName;
                        if (_streamName.slice(-4).toLowerCase() == ".flv") {
                            _streamName = _streamName.slice(0, -4);
                        }
                        //
                       
                       
                        if (_appName == undefined || _appName == "" || _streamName == undefined || _streamName == "") {
                            throw new VideoError(VideoError.INVALID_CONTENT_PATH, _contentPath);
                        }
                       
                        connectRTMP();
                    }
                }
            } catch (err:Error) {
                _nc = undefined;
                _owner.ncConnected();
                throw err;
            }
        }
        private function isAkamaiStreamingURL(url:String):Boolean {
           
            return (url.toLowerCase().indexOf("edgefcs.net/") != -1);
        }
        private function nextConnect():Void {
            //
            clearInterval(_tryNCIntervalId);
            _tryNCIntervalId = 0;
            var protocol:String;
            var port:String;
            if (_connTypeCounter == 0) {
                protocol = _protocol;
                port = _portNumber;
            } else {
                port = null;
                if (_protocol == "rtmp:/") {
                    protocol = "rtmpt:/";
                } else if (_protocol == "rtmpe:/") {
                    protocol = "rtmpte:/";
                } else {
                    _tryNC.pop();
                    return;
                }
            }
            //
            if (isAkamai == true) {
                var xnURL:String = protocol + "/" + _serverNameAkamai + _akamaiToken
                } else {
                var xnURL:String = protocol + ((_serverName == undefined) ? "" : "/" + _serverName + ((port == null) ? "" : (":" + port)) + "/") + ((_wrappedURL == undefined) ? "" : _wrappedURL + "/") + _appName;
            }
            //
            _tryNC[_connTypeCounter].pending = true;
            _tryNC[_connTypeCounter].connect( xnURL, _autoSenseBW);
            if (_connTypeCounter < (_tryNC.length-1)) {
                _connTypeCounter++;
                _tryNCIntervalId = setInterval(this, "nextConnect", 1500);
            }
        }
    }

    The code to include in the FLA:
    Actionscript Code:
    var __forceExtendedNCManager:ExtendedNCManager;
    mx.video.VideoPlayer.DEFAULT_INCMANAGER = "ExtendedNCManager"

    I must say that this type of thing is MUCH easier to figure out in AS3. I've done my AS2 work for the week. Enough.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center