【问题标题】:Use Flash to play a sound track from different files seamless?使用 Flash 无缝播放来自不同文件的音轨?
【发布时间】:2012-01-01 17:29:02
【问题描述】:

我的 http 服务器上有一些音频文件,我想在 ActionScript3 中编写一个 Flash 客户端来加载这些音频文件并顺利播放它们。当然,我可以只创建一个 Sound 对象并通过 .load() 使用 URL 请求加载它。但是为了节省带宽,我更喜欢按需加载音频文件块。例如,有一个音频文件,比如说 100MB。如果我们尝试在用户打开页面时尽可能快地加载

<--------- 100MB ----------->

下载可能会在几分钟内完成,但假设用户在中途停止监听,那么首先加载整个音轨是一种浪费。

<--------- 100MB ----------->
   ^--- user may stop here

为了解决这个问题,我认为最好将大音频文件分成小块,按需加载和播放。

<--- 10MB ---><--- 10MB ---><--- 10MB ---> ...
                                     ^--- user current position

我想设计播放器,让它逐块加载音频块,并且只有在接近当前块的末尾时才加载它。

问题来了 - 如何加载这些块并顺利播放它们?我可能可以为每个块创建 Sound 对象。但是如何无缝播放呢?

【问题讨论】:

    标签: flash actionscript-3 networking audio


    【解决方案1】:

    您可能想要使用SoundChannel,并查看那里的exampletutorial。加载声音后,您可以播放声音、存储位置并获取长度以找出剩余的播放时间。从那里,可能会发送一个事件来加载下一个声音。源自第二个示例(您必须将其放在您的类结构中):

    // Note that you will need some type of sound management 
    // class to listen to events and to play the series of sounds.  
    // That is not documented here.
    
    import flash.events.Event; 
    import flash.media.Sound; 
    import flash.net.URLRequest; 
    
    var snd:Sound = new Sound(); 
    var req:URLRequest = new URLRequest("sound1.mp3"); 
    snd.load(req); 
    
    var channel:SoundChannel; 
    channel = snd.play(); 
    addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
    
    function onEnterFrame(event:Event):void 
    { 
        var estimatedLength:int =  
            Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
        var playbackPercent:uint =  
            Math.round(100 * (channel.position / estimatedLength)); 
        if( playbackPercent > 75) 
            loadNextSound();
        trace("Sound playback is " + playbackPercent + "% complete."); 
    } 
    
    function loadNextSound() 
    {
        // In whatever sound manager class you create, 
        // listen for this "loadNextSound" event, 
        // and start the next sound loading when it occurs.
        dispatchEvent(new Event("loadNextSound"));
    
    }
    
    
    function onPlaybackComplete(event:Event) 
    { 
        trace("The sound has finished playing."); 
        removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2018-05-04
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2023-03-04
      相关资源
      最近更新 更多