А, ок, принцип работы следующий, в полученном массиве будут кадры видео выдернутые из 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 нормально читаются, а в каких-то есть напряги со звуком, которые я не понял как побороть...
|