首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FileReference播放声音?

如何使用FileReference播放声音?
EN

Stack Overflow用户
提问于 2013-08-23 14:42:56
回答 2查看 1.1K关注 0票数 0

我构建了一个flex应用程序来播放声音。我用FileReference浏览mp3文件。如何使用FileReference对象通过Sound Class播放方法播放该文件。或者我可以将数据从该FileReference对象加载到byteArray中。该byteArray可以使用声音类播放吗?谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-08-25 06:49:45

如果您使用FileReference将mp3文件加载到Sound对象中,那么它将不能正确播放,因为数据是压缩的(音频将是噪声)。

无论如何,有一个替代代码库也可以解决您的问题...:http://flexiblefactory.co.uk/flexible/?p=46

在本文中,您还可以找到此zip文件的链接:

http://www.flexiblefactory.co.uk/flexible/wp-content/uploads/mp3filereferenceloaderlib.zip

我不使用Flex,但要在Flash中设置,我会进入压缩文件,并将org文件夹文件复制到我的项目文件夹(作为子文件夹),然后将以下代码放入.as文件中,并将FLA作为stage。

您还需要创建三个sprites或MovieCips来用作按钮。

  • 文件打开(实例名称: btn_open)
  • Play (实例名称:btn_play)
  • 停止(实例名称: btn_stop)

* AS3代码*

代码语言:javascript
复制
package  
{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.utils.ByteArray;
import flash.media.Sound;
import flash.media.SoundChannel;

import org.audiofx.mp3.MP3FileReferenceLoader;
import org.audiofx.mp3.MP3SoundEvent;


public class MP3_fileRef_test extends MovieClip 

{
    private var loader:MP3FileReferenceLoader;
    private var fileReference:FileReference;
    public var _loadedsound:Sound = new Sound;
    public var channel_obj:SoundChannel = new SoundChannel();
    public var mp3_isPlaying:Boolean;


    public function MP3_fileRef_test() 
    {
        mp3_isPlaying = false;

        btn_open.buttonMode = true;
        btn_open.addEventListener(MouseEvent.CLICK, mp3Open_handler);

        btn_play.buttonMode = true;
        btn_play.addEventListener(MouseEvent.CLICK, audio_play);

        btn_stop.buttonMode = true;
        btn_stop.addEventListener(MouseEvent.CLICK, audio_stop);

        loader = new MP3FileReferenceLoader();
        loader.addEventListener(MP3SoundEvent.COMPLETE, mp3Loader_Complete);

        fileReference=new FileReference();
        fileReference.addEventListener(Event.SELECT,fileReferenceSelectHandler);
    }

    //OPEN BROWSE WINDOW & TRIGGER EVENT FUNCTION fileReferenceSelectHandler 
    private function mp3Open_handler (ev:MouseEvent):void
    {
        fileReference.browse( [new FileFilter("mp3 files","*.mp3")] );
    }

    private function fileReferenceSelectHandler(e:Event):void
    {
        loader.getSound(fileReference);
    }

    private function mp3Loader_Complete (loader_mp3Data:MP3SoundEvent):void
    {
        //CHECK IF THERE'S A PREVIOUSLY OPENED FILE PLAYING
        //OTHERWISE WILL BE MULTIPLE SOUNDS PLAYING OVER EACH OTHER
        if (mp3_isPlaying == true)
        {
            channel_obj.stop();
            mp3_isPlaying = false;
        }

        _loadedsound = new Sound;
        _loadedsound.addEventListener(Event.COMPLETE, soundLoad_Complete);

        //PUT (MP3SoundEvent) LOADER DATA INTO NEW _loadedsound SOUND OBJECT
        _loadedsound = loader_mp3Data.sound;

        //UNLOCK BELOW FOR AUTO-START WITHOUT PRESSING PLAY BUTTON
        //channel_obj = _loadedsound.play(); //auto
        //mp3_isPlaying = true; //auto
    }

    //WHEN SOUND IS LOADED AND READY FOR USE
    function soundLoad_Complete(e:Event):void
    {
        //Do whatever else is needed on successful  load
        //eg: trace or update status text, make an MC visible etc
    }

    //PLAY AUDIO ON CLICK
    function audio_play (e:MouseEvent):void 
    {
        if (mp3_isPlaying == false)
        {
            channel_obj = _loadedsound.play();
            mp3_isPlaying = true;
        }
    }

    //STOP AUDIO ON CLICK   
    function audio_stop (e:MouseEvent):void 
    {
        if (mp3_isPlaying == true)
        {
            channel_obj.stop();
            mp3_isPlaying = false;
        }
    }


}//END CLASS

}//END PACKAGE

希望能有所帮助。和平我要离开这里..。

票数 1
EN

Stack Overflow用户

发布于 2013-08-23 15:21:27

这应该是可能的。首先从FileReference加载一个mp3,然后实例化new Sound(),然后调用loadCompressedDataFromByteArray(loadedBytes,loadedBytes.length)并播放它。如果FileReference没有执行此操作,请不要忘记将有问题的ByteArray倒回到起始位置,因为此函数使用当前位置作为文件的起始位置。

The manual.

更新:如果您使用的是Flash player 10,则此方法不可用。为此,请尝试在FileReference.name之外创建一个URLRequest,然后通过这个伪造的请求加载声音。

代码语言:javascript
复制
var ur:URLRequest=new URLRequest(fileRef.name);
var snd:Sound=new Sound(ur);
snd.addEventListener(Event.COMPLETE,sndLoaded);

然后,您将加载的声音处理为就绪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18396482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档