2012-03-26 10 views
1

我々はユーザーのウェブカメラからビデオを記録するためにAdobe FMS 4.5を利用しています。私たちはこのビデオをライブ放送していません。キャプチャして後で(ユーザーのアカウントに添付したり、ページはめ込みのコンテンツとして表示するなど)、サーバー上に保存しておきたいだけです。FMS4.5へのパブリッシュ/録画は、ビデオの先頭に小さな隙間を残す

サーバにストリーミング配信し、正しく公開を取りやめ、公開が完了していない動画を視聴できるようにした堅牢なキャプチャアプリケーションを作成しました。これは動画ファイルを私たちは期待する。

問題は、録画されたビデオのほうが最初に小さなギャップがあるように見えることです。これは1秒未満です。私たちはおそらく5/100秒から1/10秒までビデオデータがないと話しています。ビデオの最初の部分にビデオキーフレームがないように見えます。

これは通常問題ではありません。ビデオはちょっと再生から始まり、ほとんどのプレーヤーでうまく再生されます。問題は、私たちはユーザーが別のツール(FFmpegへのカスタムビジュアルインターフェイス)で任意に後でビデオをトリミングできるようにすることです。その最初のキーフレームの前にビデオトリムを開始すると、FFmpegがカッティングを開始した領域にビジュアルデータがないので、最終出力には醜いグレーの混乱があります。

私の最初の考えは、「ああ、私は別の点で|コールバックのようにカメラを取り付ける必要があります。 NetStream.Publish.Startなどの後に、パブリッシュを呼び出す前にカメラを接続して遊んだ。

ここに本質的なものがないのですか?あるいは私はちょうど間違ったアイデアを使って作業しているのですか?それともプロセスを誤解していますか?

当然のことながら、私は完全に期待していますが、望んでいないのは、「それはFMSのやり方です。 :)ビデオの最初のXXビットを削除するサーバー側のプロセスを追加できますが、それは任意です。どのくらいトリムするか分かりません。ユーザーデータを失うリスクはありません。

は、ここでは、使用されるコードの一般化です:

private function init():void 
{ 
    var my_errors:Array = []; 

    if (!Camera.isSupported) 
    { 
     my_errors.push('camera is not supported'); 
    } 
    else 
    { 
     camera = Camera.getCamera(); 
     if (!camera) 
     { 
      my_errors.push('no camera found'); 
     } 
     else if (camera.muted) 
     { 
      Security.showSettings(SecurityPanel.PRIVACY); 
     } 
    } 

    mic = Microphone.getMicrophone(); 
    if (!mic) 
    { 
     my_errors.push('no microphone found'); 
    } 

    if (my_errors.length) 
    { 
     this.fatal_error(my_errors); 
     return; 
    } 

    camera.setMode(camera_width, camera_height, camera_fps, true); 
    camera.setQuality(0, camera_quality); 

    netconnect = new NetConnection(); 
    netconnect.addEventListener(NetStatusEvent.NET_STATUS, net_status_handler); 
    netconnect.connect(publish_url); 
} 
private function net_status_handler(ev:NetStatusEvent):void 
{ 
    switch (ev.info.code) 
    { 
     case 'NetConnection.Connect.Success': 
      trace('CONNECT: Connected to "' + publish_url + '"'); 
      begin_stream(); 
     break; 
    } 
} 
private function begin_stream():void 
{ 
    if (this.recording) 
     return; 
    this.recording = true; 

    guid = GUID.create(); 

    netstream = new NetStream(netconnect); 
    netstream.addEventListener(NetStatusEvent.NET_STATUS, net_stream_handler); 
    netstream.attachCamera(camera); 
    netstream.attachAudio(mic); 
    netstream.publish(guid, 'record'); 
} 

答えて

0

Cameraオブジェクト上StatusEvent.STATUSイベントを聴いてみてください。 フラッシュセキュリティダイアログの[許可]ボタンをクリックすると、カメラ/マイクアクセスの許可を求めるメッセージが表示されます。codeのパラメータは 'Camera.Unmuted'です。 'publish'コマンドを実行します。

function camStatus (evt:StatusEvent) { 
    if (evt.code == 'Camera.Unmuted') { 
     // Check if this is the first 'unmute' (as users can also unmute/mute later), 
     // if so - publish on the netstream 
    } 
} 
var camera:Camera = Camera.getCamera(); 
camera.addEventListener(StatusEvent.STATUS,camStatus); 

ユーザーがカメラにアクセスを許可している前に公開する場合 - カメラからのビデオはまだありませんように、空のフレームが記録されます... あなたはもちろんのサーバーレベルでこれを管理することができます(録画を開始するStatusEvent内からサーバー側の関数を呼び出す...)

関連する問題