2012-03-26 14 views
1

我們利用Adobe FMS 4.5錄製來自用戶網絡攝像頭的視頻。我們並未實時播放此視頻,我們只是想將其捕獲並保存在服務器上,以便稍後處理它(附加到用戶帳戶,顯示爲頁內容等)。發佈/錄製到FMS4.5在視頻開始時留下小缺口

我們已經編寫了一個強大的捕獲應用程序,它可以傳輸到服務器,取消正確發佈,並允許用戶在完成取消發佈後查看視頻等。這似乎起作用,因爲它將視頻文件保存爲我們期待。

問題是,那些錄製的視頻在開始時似乎有一個小小的差距。這大大小於一秒鐘。我們正在談論的可能是5/100s到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事件。 當用戶點擊彈出的閃光安全對話框上的'允許'按鈕以詢問是否允許攝像頭/麥克風訪問時,StatusEvent將被觸發,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中調用一個服務器端函數,它將開始錄製......)