Показать сообщение отдельно
Старый 10.02.2010, 15:35
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А, ок, принцип работы следующий, в полученном массиве будут кадры видео выдернутые из 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 нормально читаются, а в каких-то есть напряги со звуком, которые я не понял как побороть...
__________________
Hell is the possibility of sanity