Используйте Flash для воспроизведения звуковой дорожки из разных файлов? - PullRequest
1 голос
/ 01 января 2012

У меня есть несколько аудиофайлов на моем http-сервере, и я хотел бы написать Flash-клиент в ActionScript3 для загрузки этих аудиофайлов и их плавного воспроизведения. Конечно, я могу просто создать объект Sound и загрузить его с помощью .load () с URL-запросом. Но для экономии пропускной способности я предпочитаю загружать фрагменты аудиофайлов по требованию. Например, есть аудиофайл, скажем, 100 МБ. Если мы попытаемся загрузить как можно быстрее, когда пользователь откроет страницу

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

Загрузка может быть завершена в течение нескольких минут, но, скажем, если пользователь остановит прослушиватель на полпути, это своего рода трата на загрузку всего саундтрека вначале.

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

Чтобы решить эту проблему, я думаю, что лучше разбить большой аудиофайл на маленькие порции, загружать и воспроизводить их по требованию.

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

Я хочу спроектировать проигрыватель, разрешить ему загружать аудиоблок за фрагментом и загружать его только тогда, когда он ближе к концу текущего блока.

Здесь возникает вопрос - как загрузить эти чанки и воспроизвести их плавно? Я, вероятно, могу создать объект Sound для каждого блока. Но как играть в них без проблем?

1 Ответ

1 голос
/ 02 января 2012

Возможно, вы захотите использовать SoundChannel, и посмотрите пример там и учебник . Как только вы загрузите звук, вы можете воспроизвести его, сохранить позицию и узнать длительность, чтобы определить оставшееся время для воспроизведения. Оттуда, вероятно, отправьте событие, чтобы загрузить следующий звук. Получено из второго примера (вам нужно будет указать структуру вашего класса):

// 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); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...