• Sound.loadCompressedDataFromByteArray


    前不久Adobe发布了Flash Player 11的release版本, Flash Player 11 带来了很多新特性, 最最红火的就是Stage3D了,但是这里讲的是这个版本的另一个新特性, 直接播放MP3数据 Sound.loadCompressedDataFromByteArray.
    以往我们要播放一个mp3,必须要有一个路径才能播放, 每次想要将声音文件缓存起来,就不方便.现在Flash 提供了直接播放bytearray的API,那么就方便多了。

    Sound.loadCompressedDataFromByteArray带来的便利

    • 直接播放bytearray,而不再需要url地址.
    • 可以方便的播放音频片段,而不必加载完整的mp3文件.
    • 结合URLStream类,可以方便的实现边听边存功能.
    • 可以对保存的音乐进行加密,从而保护版权. 目前只想到以上几点,不过结合这个API肯定能做更多的事。

    使用FlahsPlayer11的新特性注意事项

    一定要在编译器选项里添加 -swf-version=13 . 否则会运行时报错,找不到相关的API。
    在FlashDevelop里设置:
    Project菜单 => Properties..子菜单, 打开 Properties面板。
    Compiler Options选项卡 => Additional Compiler Options。
    输入 -swf-version=13 , 一路确定着出来就行了。

    FlashDevelop里设置Flashplayer11编译器选项
    fd-setting-flashplayer11.jpg

    在FlashBuilder里设置:
    Project菜单 => Properties..子菜单, 打开 Properties面板。
    Flex编译器选项 => 附加的编译器参数。
    添加 -swf-version=13 ,一路确定着出来就行了。

    FlashBuilder里设置Flashplayer11编译器选项
    fb-setting-flashplayer11.jpg

    示例

    请确保声卡驱动已经安装好,并且能播放声音。

    源代码

    package 
    {
        import fl.controls.TextInput;
        import fl.events.ComponentEvent;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.events.SecurityErrorEvent;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.net.URLRequest;
        import flash.net.URLStream;
        import flash.text.TextField;
        import flash.utils.ByteArray;
        import flash.utils.setTimeout;
    
        /**
         * Sound.loadCompressedDataFromByteArray
         * @author lite3
         * @link http://www.litefeel.com
         */
        [SWF(width = 600, height = 170)]
        public class Main extends Sprite 
        {
            private const SOUND_URL:String = "http://www.sqcbbs.net/data/attachment/forum/music/suyan.mp3";
    
            private var sound:Sound;
            private var stream:URLStream;
    
            private var isPlaying:Boolean;
            private var sc:SoundChannel;
    
            private var txt:TextField;
            private var input:TextInput;
    
            public function Main():void 
            {
                initUI();
    
                sound = new Sound();
                stream = new URLStream();
                stream.addEventListener(Event.COMPLETE, streamHandler);
                stream.addEventListener(ProgressEvent.PROGRESS, streamHandler);
                stream.addEventListener(IOErrorEvent.IO_ERROR, streamHandler);
                stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, streamHandler);
    
                var url:String = loaderInfo.parameters.soundURL ? loaderInfo.parameters.soundURL : SOUND_URL;
                input.text = url;
                loadSound(null);
                input.addEventListener(ComponentEvent.ENTER, loadSound);
            }
    
            private function loadSound(e:ComponentEvent):void 
            {
                if (!input.text) return;
    
                if (sc != null)
                {
                    sc.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
                    sc.stop();
                    sc = null;
                }
                try {
                    stream.close();
                }catch (e:Error) { }
    
                stream.load(new URLRequest(input.text));
                showText("开始加载");
            }
    
            private function streamHandler(e:Event):void 
            {
                switch(e.type)
                {
                    case Event.COMPLETE :
                        showText("加载完成,播放中...");
                        var byte:ByteArray = new ByteArray();
                        stream.readBytes(byte, 4000, stream.bytesAvailable/10);
                        sound.loadCompressedDataFromByteArray(byte, byte.length/2);
                        playSound();
                        break;
    
                    case ProgressEvent.PROGRESS :
                        showText("加载进度:" + ProgressEvent(e).bytesLoaded + "/" + ProgressEvent(e).bytesTotal);
                        break;
    
                    case IOErrorEvent.IO_ERROR :
                        showText("加载失败");
                        break;
    
                    case SecurityErrorEvent.SECURITY_ERROR :
                        showText("安全沙箱限制,不能从目标网站加载数据");
                        break;
                }
            }
    
            private function playSound():void 
            {
                isPlaying = true;
                showText("isPlaying: " +isPlaying);
    
                sc = sound.play();
                sc.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
            }
    
            private function soundCompleteHandler(e:Event):void
            {
                isPlaying = false;
                showText("isPlaying: " +isPlaying);
                setTimeout(playSound, 1000);
            }
    
            private function showText(text:String):void
            {
                txt.text = text;
            }
    
            private function initUI():void 
            {
                txt = new TextField();
                txt.mouseEnabled = false;
                txt.text = "Sound.loadCompressedDataFromByteArray For Flash Player 11";
                txt.width = 600;
                txt.height = txt.textHeight + 4;
                txt.mouseEnabled = false;
                txt.autoSize = "center";
                txt.y = 10;
                addChild(txt);
    
                txt = new TextField();
                txt.text = "请输入MP3地址并回车,以更换MP3.";
                txt.mouseEnabled = false;
                txt.width = txt.textWidth + 4;
                txt.height = txt.textHeight + 4;
                txt.x = 10;
                txt.y = 100;
                addChild(txt);
    
                input = new TextInput();
                input.width = 550;
                input.x = 10;
                input.y = 120;
                addChild(input);
    
                txt = new TextField();
                txt.mouseEnabled = false;
                txt.width = 300;
                txt.height = 40;
                txt.x = 100;
                txt.y = 50;
                addChild(txt);
            }
        }
    }
  • 相关阅读:
    Java实现代理服务器
    UML快速理解
    Linux常用命令
    线程数设置和CPU数的关系
    面试官:你在平时的工作中遇到过哪些问题让你印象深刻?
    常见的思考问题方法、处理问题工具
    分布式锁的几种使用方式(redis、zookeeper、数据库)
    MySQL数据库连不上?
    Oracle备份的几种方式
    ORACLE物理standby与逻辑standby简述
  • 原文地址:https://www.cnblogs.com/lancidie/p/5104253.html
Copyright © 2020-2023  润新知