[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

Flexの映像をJpegに書き出し

Flexでの映像をPHPにバイナリ(JPEGエンコ)で送ってPHP側でファイル保存します。
Flex3にはJPEGEncoderっていうBitmapdataをJPEGエンコードしてくれるクラスがあり、エンコードされたものをPOSTでPHPに送ることでJPEG保存することができます。
今回はせっかくなのでFLV再生されているものからJPEGに変換してみました(FLV2JPEGみたいな)。
ですので、Webカメラを使用すれば、おそらく簡易カメラ(JPEGで保存)が作成できると思います。
サンプルはこちら。
http://moeten.info/flex/20080416_jpegEnc/bin-release/main.html

Flex側のソース
ボタンを押すとそのフレームの絵をバイナリ+JpegエンコードしてPHPに送信します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.graphics.codec.JPEGEncoder;
private var num:Number;
//現在のフレーム保存する
private function saveJPEG():void{
    //キャンバス画像用意
    var paint:BitmapData = new BitmapData( myFlv.width , myFlv.height );
    //ビデオ描画
    paint.draw(myFlv);
    //ファイル名のために現在のフレーム秒数をゲット
    num = myFlv.playheadTime;
    //バイナリデーター作成
    var myEnc:JPEGEncoder = new JPEGEncoder(100);
    var byteArr:ByteArray = myEnc.encode(paint);
    //PHPへバイナリを送信する
    var urlRequest:URLRequest = new URLRequest("http://moeten.info/flex/20080416_jpegEnc/?img=" + num );
    var urlLoader:URLLoader = new URLLoader();
    urlRequest.contentType = "application/octet-stream";
    urlRequest.method = URLRequestMethod.POST;
    urlRequest.data = byteArr;
    urlLoader.load(urlRequest);
    urlLoader.addEventListener(Event.COMPLETE , onSaved );
}
//JPEG保存完了イベント
private function onSaved( e:Event ):void{
    //保存された画像を呼び出し
    myImage.source = "http://moeten.info/flex/20080416_jpegEnc/" + num + ".jpg";
}
]]>
</mx:Script>
<mx:VideoDisplay x="202" y="10" width="365" height="259" id="myFlv" source="test.flv"/>
<mx:Image width="160" height="126" id="myImage" x="10" y="10"/>
<mx:Button x="575" y="10" label="JPG変換" click="saveJPEG()"/>
</mx:Application>

PHP側のソースはこちら
Flexから送られてくる生のPOSTデーターを単純にファイルに書きだすだけです。

<?php
if( isset( $GLOBALS["HTTP_RAW_POST_DATA"] ) ){
    //JPG 書き込み
    $data = $GLOBALS["HTTP_RAW_POST_DATA"];
    $img  = $_GET["img"];
    file_put_contents( "{$img}.jpg" , $data );
 }else{
    echo "Encoded JPEG information not received.";
 }
?>

ちなみにこちらのやり方は洋書ですが「Learning Actionscript 3.0: A Beginner's Guide (Learning)」っていう本を参考にしています。書評という名の感想は後日書きたいと思います。

Learning Actionscript 3.0: A Beginner's Guide

Learning Actionscript 3.0: A Beginner's Guide