0

在我的 .fla 文件中,我包含指令文件中指示的外部操作脚本文件

import xxx.xxx.xxx.sound.MP3Player;

var mp3Player:MP3Player = new MP3Player();
addChild(mp3Player);

现在我想使用他的 loadMp3 功能

/**
* Start loading the mp3 file.
*/
private function loadMP3():void {

mp3.load(new URLRequest(MP3_URL));
mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
channel = mp3.play();
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0,    true);            
_isPlaying = true;
}

通过 ExternalInterface 功能发现 mp3 何时完全加载并准备好播放声音。

我该怎么办?谢谢

全班

package xxx.xxx.xxx.sound {

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.text.TextField;

public class MP3Player extends MovieClip {

    // Location of the config xml file
    public static const CONFIG_XML_URL:String = "xml/config.xml";

    // URL of the mp3 file
    public static var MP3_URL:String = "mp3/track.mp3";

    // Main color for the mp3 player
    public static var MAIN_COLOR:uint = 0xFF0000;

    // An XMLLoader to load the configuration file
    private var xmlLoader:XMLLoader;

    // Sound object to be played
    private var mp3:Sound = new Sound();

    // A sound channel to play the sound object
    private var channel:SoundChannel;

    // Holds the pause position
    private var pausePos:Number;

    // A byte array to read spectrum
    private var bytes:ByteArray = new ByteArray();

    // Indicates whether the mp3 player is playing or not.
    private var _isPlaying:Boolean = false;

    // Holds the previous label color
    private var _prevColor:uint;        

    public function MP3Player() {

        // Initialize the player
        init();

    }

    /**
     * Initializes the player.
     */
    private function init():void {

        // Use as a button
        useHandCursor = true;
        buttonMode = true;
        mouseChildren = false;
        equalizer.alpha = 0;

        // Add necessary event listeners
        addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
        addEventListener(MouseEvent.MOUSE_OVER, onMouseOver, false, 0, true);
        addEventListener(MouseEvent.MOUSE_OUT, onMouseOut, false, 0, true);
        loadConfig();

    }

    /**
     * Sets the color of the player to the given parameter.
     */
    public function setColor(color:uint):void {

        MAIN_COLOR = color;

        // Change the color of the equalizer
        var colorTransform:ColorTransform = equalizer.transform.colorTransform;
        colorTransform.color = MAIN_COLOR;
        equalizer.transform.colorTransform = colorTransform;

    }


    /**
     * Loads the configuration file to the memory.
     */
    private function loadConfig() {

        // Start loading the config.xml file
        xmlLoader = new XMLLoader(CONFIG_XML_URL);
        xmlLoader.addEventListener(XMLLoader.XML_LOADED, onXMLLoaded);
        xmlLoader.load();

    }

    /**
     * This method is called when the xml file is loaded to the memory.
     */
    private function onXMLLoaded(evt:Event):void {

        // Get configuration parameters
        var xml:XML = xmlLoader.getXML();
        MP3_URL = xml.@mp3URL;
        MAIN_COLOR = xml.@color;

        // Change the color of the equalizer
        equalizer.alpha = 1;
        setColor(MAIN_COLOR);

        // Start loading the mp3
        loadMP3();

    }

    /**
     * Start loading the mp3 file.
     */
    private function loadMP3():void {

        mp3.load(new URLRequest(MP3_URL));
        mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
        channel = mp3.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);            
        _isPlaying = true;

    }

    /**
     * This method is called whenever a new enter frame event occurs.
     */
    private function onEnterFrame(evt:Event):void {

        try {
            SoundMixer.computeSpectrum(bytes, true, 0);
        } catch (e:Error) {
        }

        equalizer.update(bytes);

    }

    /**
     * This method is called when playing the sound is finished.
     */
    private function onSoundComplete(evt:Event):void {

        // Loop
        channel = mp3.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
        _isPlaying = true;

    }

    /**
     * This method is called when the mouse is over the mp3 player.
     */
    private function onMouseOver(evt:MouseEvent):void {

        // Change the color of the equalizer
        _prevColor = label.textColor;
        label.textColor = MAIN_COLOR;

    }

    /**
     * This method is called when the mouse leaves the mp3 player.
     */
    private function onMouseOut(evt:MouseEvent):void {

        label.textColor = _prevColor;

    }

    /**
     * This method is called when the mouse is clicked on the mp3 player.
     */
    private function onMouseDown(evt:MouseEvent):void {

        if (_isPlaying) {
            pausePos = channel.position;
            channel.stop();
            _isPlaying = false;
            label.text = "MUSIC OFF";               
        } else {
            channel = mp3.play(pausePos);
            channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
            _isPlaying = true;
            label.text = "MUSIC ON";
        }

    }

    /**
     * This method is called if an IO error occurs.
     */
    private function onIOError(evt:IOErrorEvent):void {
    }

}

}

4

2 回答 2

1

为了发现您的 MP3 何时完全加载,您可以在loadMP3()函数中添加以下行:

mp3.addEventListener(Event.COMPLETE, onLoadComplete); 

你也应该有这个功能。

private function onLoadComplete(e:Event):void {
    // This will call a JavaScript function
    ExternalInterface.call('toJS');
}

为了使ExternalInterface工作正常,您应该导入类:

import flash.external.ExternalInterface;

与在您的 HTML 中相比,您应该添加一个具有相同名称“toJS”的函数,以便在 JavaScript 中获取您的回调。(您可以随意调用此函数)。

于 2013-07-29T18:38:01.670 回答
0

我插入了 putvande 向我建议的代码。

package xxx.xxx.xxx.sound {
..
..
import flash.external.ExternalInterface;

..
..

/**
* Start loading the mp3 file.
*/
private function loadMP3():void {

  mp3.load(new URLRequest(MP3_URL)); 
  mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
  channel = mp3.play();
  channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);          
 _isPlaying = true;

// Load complete function
mp3.addEventListener(Event.COMPLETE, onLoadComplete);
}

/**
* This method is called when load complete and sent call to js.
*/
private function onLoadComplete(e:Event):void {
  // This will call a JavaScript function
  if (ExternalInterface.available)
  {
    ExternalInterface.call("loadedCallback");
  }
}
..
..

此解决方案完美运行,但我也将解决编译 swf 时出现的问题并收到此消息(一旦在公共 html 页面中不显示)

在此处输入图像描述

如何修复此警告消息?谢谢!

于 2013-07-30T08:41:31.173 回答