Skip to content

Instantly share code, notes, and snippets.

@sdrahan
Created August 12, 2017 08:39
Show Gist options
  • Select an option

  • Save sdrahan/e06a5b9c17b16ec42bf1ec60fa22bbd4 to your computer and use it in GitHub Desktop.

Select an option

Save sdrahan/e06a5b9c17b16ec42bf1ec60fa22bbd4 to your computer and use it in GitHub Desktop.
Generate flv with audiotrack from MovieClip and Sound
// flvEncoder lib is required: https://github.com/zeropointnine/leelib/tree/master/src/leelib/util/flvEncoder
package {
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.media.Sound;
import flash.utils.ByteArray;
import leelib.util.flvEncoder.ByteArrayFlvEncoder;
import leelib.util.flvEncoder.FlvEncoder;
import leelib.util.flvEncoder.VideoPayloadMakerAlchemy;
[SWF(width="320", height="240", frameRate="30")]
public class Main extends Sprite {
private var bitmaps:Array;
private var sourceMc:MovieClip;
private var baFlvEncoder:ByteArrayFlvEncoder;
private var sound:Sound;
private const OUTPUT_WIDTH:Number = 320;
private const OUTPUT_HEIGHT:Number = 240;
private const FLV_FRAMERATE:int = 15;
public function Main() {
createBitmapDataArray();
saveVideo();
}
private function createBitmapDataArray() {
bitmaps = [];
sourceMc = new TestMovieClip();
sourceMc.stop();
for (var i:int = 0; i < sourceMc.totalFrames; i++) {
var bitmapData:BitmapData = new BitmapData(OUTPUT_WIDTH, OUTPUT_HEIGHT, false, 0x0);
bitmapData.draw(sourceMc);
bitmaps.push(bitmapData);
sourceMc.nextFrame();
}
sound = new TestMusicForVideo();
}
private function saveVideo():void {
// Prepare the audio data
var baAudio:ByteArray = new ByteArray();
var seconds:Number = bitmaps.length / FLV_FRAMERATE;
sound.extract(baAudio, seconds * 44000 + 1000);
// Make FlvEncoder object
baFlvEncoder = new ByteArrayFlvEncoder(FLV_FRAMERATE);
baFlvEncoder.setVideoProperties(OUTPUT_WIDTH, OUTPUT_HEIGHT, VideoPayloadMakerAlchemy);
baFlvEncoder.setAudioProperties(FlvEncoder.SAMPLERATE_44KHZ, true, true, true);
baFlvEncoder.start();
// Make FLV:
for (var i:int = 0; i < bitmaps.length; i++) {
var audioChunk:ByteArray = new ByteArray();
audioChunk.writeBytes(baAudio, i * baFlvEncoder.audioFrameSize, baFlvEncoder.audioFrameSize);
baFlvEncoder.addFrame(bitmaps[i], audioChunk);
bitmaps[i].dispose();
}
baFlvEncoder.updateDurationMetadata();
saveViaFile();
// cleanup
baFlvEncoder.kill();
}
private function saveViaFile():void {
var file:File = File.applicationStorageDirectory.resolvePath("video.flv");
var writeFileStream:FileStream = new FileStream();
writeFileStream.open(file, FileMode.WRITE);
writeFileStream.writeBytes(baFlvEncoder.byteArray);
writeFileStream.close();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment