2012-04-23 2 views
2

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

Остановить видеоролик, как только он будет загружен почти решает проблему, но иногда я все еще слышу начало клипа. Видимо, клип не дождался завершения обработчиков событий до начала ...?

// example of stopping a clip after it is loaded 
// sound may still be heard for a moment 
var loader: Loader = new Loader(); 
loader.addEventListener(Event.COMPLETE, function(e : *) : void { 
    (loader.contentLoaderInfo.content as MovieClip).stop(); 
}); 
loader.load("a_loud_movie_clip.swf"); 

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

Есть ли стандартное решение этой проблемы? Я чувствую, что это должна быть очень распространенная проблема.

ответ

3

Вы предварительно загружаете, потому что ваш SWF расположен на веб-сервере? Если это так, одним из вариантов было бы предварительно загрузить байты с сервера, фактически не интерпретируя их, используя URLLoader. Затем, когда вам нужно отобразить MovieClip, введите предварительно загруженные байты (URLLoader.data) в загрузчик, используя Loader.loadBytes, чтобы фактически создать экземпляр MovieClip (и начать воспроизведение, звук и все). Может быть небольшое отставание во время создания экземпляра, но это будет намного меньше, чем без предварительного загрузчика.

За свой вопрос о типе Loader.content:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Loader; 
    import flash.display.Bitmap; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.utils.ByteArray; 
    import flash.utils.getQualifiedClassName; 

    public class tst extends Sprite 
    { 
    [Embed(source="any_image.png", mimeType="application/octet-stream")] 
     private var img_bytes:Class; 

    [Embed(source="any_swf.swf", mimeType="application/octet-stream")] 
     private var swf_bytes:Class; 


    public function tst():void 
    { 
     var b1:ByteArray = new img_bytes(); 
     var l1:Loader = new Loader(); 
     l1.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l1.content)); 
     trace(l1.content is Bitmap); 
     }); 
     l1.loadBytes(b1); 

     var b2:ByteArray = new swf_bytes(); 
     var l2:Loader = new Loader(); 
     l2.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l2.content)); 
     trace(l2.content is MovieClip); 
     }); 
     l2.loadBytes(b2); 

    } 
    } 
} 

(Примечание: это просто показательный код - НЕ добавлять обработчики событий с закрытием функции, как это, это приведет к памяти утечки. Я также пропускаю URLLoader и просто встраиваю, чтобы получить свои байты, но они одинаковые байты в любом случае).

И выход:

flash.display::Bitmap 
true 
test_fla::MainTimeline 
true 

Однако, Bitmap и MovieClip не единственные варианты Loader.content - Загрузка SWF скомпилированной из кода может быть получен из Sprite и может показать полный класс имя, хотя, как указывает www0z0k, все они получены из DisplayObject. Хотя я считаю, что любой SWF-выход из Flash Professional всегда происходит из MovieClip.

За записной что Загрузчик байт всегда MovieClips

Оказывается, вы правы - это загрузчик, который загружает регулярное старое изображение, свойство contentLoaderInfo.bytes содержит байты для генерируемого SWF, который простая обложка MovieClip с изображением в качестве Ребенка. Кто бы догадался ?!

var l3:Loader = new Loader(); 
    l3.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
    trace("- l3:"); 
    trace(getQualifiedClassName(l3.content)); 
    trace(l3.content is Bitmap); 

    // This ByteArray is a SWF! 
    var b3:ByteArray = l3.contentLoaderInfo.bytes; 

    var l4:Loader = new Loader(); 
    l4.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace("- l4:"); 
     trace(getQualifiedClassName(l4.content)); 
     trace(l4.content is Bitmap); 
     trace(Object(l4.content).getChildAt(0) is Bitmap); 
    }); 
    l4.loadBytes(b3); 
    addChild(l4); 

    }); 
    l3.load(new URLRequest("any_image.png")); 

Выход:

- l3: 
flash.display::Bitmap 
true 
- l4: 
flash.display::MovieClip 
false 
true 
+0

Это именно та вещь, что я искал. –

+0

Связанная проблема: если я действительно не загружаю объект, то каков наилучший способ определить, должен ли он быть образом? В прошлом я заметил, что загрузка массива байтов данных изображения создает клип. –

+0

Я не уверен, что я точно понимаю ваш вопрос, но после использования Loader.loadBytes вы получите Event.COMPLETE, в это время Loader.контент должен быть либо Bitmap (если байты были JPEG или PNG, например), так и MovieClip (если байты были SWF), поэтому вы знали бы, сможете ли вы взаимодействовать с ним (останавливаться/играть) или нет. –

Смежные вопросы