Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   play Embeded FLV / MP3 (http://www.flasher.ru/forum/showthread.php?t=136066)

$mival 09.02.2010 10:55

play Embeded FLV / MP3
 
Код AS3:

[Embed(source = "video.flv", mimeType = "application/octet-stream")]

Как воспроизвести?
Поиск не помог
FD

wvxvw 09.02.2010 14:35

http://code.google.com/p/e4xu/source...VTranscoder.as
Но там есть пара багов, которые я не знаю как пофиксить / чем они вызваны... Т.е. не все FLV будут работать.
Или вот: http://lib.haxe.org/d/format/1.14/format/flv

$mival 09.02.2010 15:01

Цитата:

Сообщение от wvxvw (Сообщение 885047)
http://code.google.com/p/e4xu/source...VTranscoder.as
Но там есть пара багов, которые я не знаю как пофиксить / чем они вызваны... Т.е. не все FLV будут работать.
Или вот: http://lib.haxe.org/d/format/1.14/format/flv

мм, отдаем ByteArray, получаем Vector.<ByteArray>
это должно как то помочь решить вопрос?

wvxvw 10.02.2010 15:35

А, ок, принцип работы следующий, в полученном массиве будут кадры видео выдернутые из FLV. Что нужно дальше сделать:
Код AS3:

public static function compileEmbeddedVideo(input:ByteArray, toFile:String):ByteArray
{
                var sbgColor:SetBackgroundColor = new SetBackgroundColor();
                sbgColor.color = 0xFF;
 
                var defSLData:DefineSceneAndFrameLabelData = new DefineSceneAndFrameLabelData();
                //defSLData.frameLabelCount
 
                var symbol:SymbolClass = new SymbolClass();
                symbol.classNames = ["embedded_fla.MainTimeline"];
                symbol.numSymbols = 1;
                symbol.tagIDs = [1];
 
                var frames:Vector.<ByteArray> = FLVTranscoder.read(input);
                var videoStream:DefineVideoStream = new DefineVideoStream();
                videoStream.characterID = 1;
                videoStream.codecID = FLVTranscoder.videoCodec;
                videoStream.height = FLVTranscoder.height;
                videoStream.width = FLVTranscoder.width;
                videoStream.numFrames = frames.length;
 
                var placeObject:PlaceObject2 = new PlaceObject2();
                placeObject.characterId = 1;
                placeObject.depth = 1;
                placeObject.placeFlagHasCharacter = true;
                placeObject.placeFlagHasMatrix = true;
                placeObject.matrix = SWFUtils.writeMatrix(new Matrix());
                var poBA:ByteArray = placeObject.compile();
 
                var videoFrame:VideoFrame = new VideoFrame();
                videoFrame.streamID = 1;
 
                var showFrame:ShowFrame = new ShowFrame();
                var sfBA:ByteArray = showFrame.compile();
 
                var swf:ByteArray = new ByteArray();
                swf.endian = Endian.LITTLE_ENDIAN;
                frameCount = frames.length;
                writeHeader(swf, toFile);
                //swf.writeBytes(sbgColor.compile());
                //swf.writeBytes(defSLData.compile());
                //swf.writeBytes(symbol.compile());
                swf.writeBytes(videoStream.compile());
 
                var i:int;
                var fakePlaceObject:ByteArray = new ByteArray();
                fakePlaceObject.endian = Endian.LITTLE_ENDIAN;
                fakePlaceObject.writeByte(0x85);
                fakePlaceObject.writeByte(0x06);
                fakePlaceObject.writeByte(0x11);
                fakePlaceObject.writeByte(0x01);
                fakePlaceObject.writeByte(0x00);
                fakePlaceObject.writeByte(0x00);
                fakePlaceObject.writeByte(0x00);
                fakePlaceObject.position = 0x0;
 
                var soundBlock:SoundStreamBlock = new SoundStreamBlock();
                var soundHead:SoundStreamHead = FLVTranscoder.soundStreamHead;
                var mp3Data:MP3StreamSoundData = new MP3StreamSoundData();
                var hasSound:Boolean = soundHead !== null;
 
                if (hasSound) swf.writeBytes(soundHead.compile());
 
                for each (var arr:ByteArray in frames)
                {
                                videoFrame.frameNum = i;
                                videoFrame.videoData = arr;
 
                                if (i === 0x0)
                                {
                                                poBA.position = 0x0;
                                                swf.writeBytes(poBA);
                                }
                                else
                                {
                                                fakePlaceObject.position = 0x5;
                                                fakePlaceObject.writeShort(i);
                                                fakePlaceObject.position = 0x0;
                                                swf.writeBytes(fakePlaceObject);
                                }
                                swf.writeBytes(videoFrame.compile());
 
                                if (hasSound)
                                {
                                                mp3Data.data = FLVTranscoder.soundFrames[i];
                                                mp3Data.seekSamples = FLVTranscoder.seekSamples[i];
                                                mp3Data.sampleCount = FLVTranscoder.sampleCounter[i];
                                                soundBlock.streamSoundData = mp3Data.write();
                                                swf.writeBytes(soundBlock.compile());
                                }
 
                                sfBA.position = 0x0;
                                swf.writeBytes(sfBA);
                                i++;
                }
 
                writeEnd(swf);
                swf.position = 0x4;
                swf.writeUnsignedInt(swf.length);
                swf.position = 0x0;
                return swf;
}

Ну и полученое - это уже будет SWF со встроенным видео, загружаем ее через Loader#loadBytes() и играем.
http://code.google.com/p/e4xu/source...VCompiler.mxml
Вот тут есть полностю работающая демка.
Но лучше было бы попробовать flv.format'ом воспользоваться, я сколько со своей эксперементировал - какие-то FLV нормально читаются, а в каких-то есть напряги со звуком, которые я не понял как побороть...

$mival 10.02.2010 16:12

получается из эмбед байтмассива мы опять возвращаем всё в файл и грузим лоадером. а смысл тогда было это делать если можно сразу загрузить FLV и так?

я же предполагал, что флеш (не эйр) будет проигрывать заэмбеденные флвшки, то есть не подгружая извне (нужно для множества видеоэффектов в презентации, которые часто обновляются и обновлять swc с ними через flash ide неудобно)

т.е. без эйр данная цель невыполнима?


Часовой пояс GMT +4, время: 21:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.