2013-01-31 53 views
4

對於我們當前的項目,我們需要一個視頻聊天應用程序,用於跟蹤這些視頻對話的持續時間。Wowza服務器模塊 - 視頻聊天定時器/倒計時

每個對話的聊天時間也有限,之後聊天結束。

我已經構建了基本模塊,但是我在實現該定時器時遇到了問題。 在WOWZA 1對1的視頻聊天應用總是2流:

User1的發佈一個流,其用戶2起着(預訂)
用戶2發佈一個流,其用戶1起着(預訂)

在數據庫中保存(在聊天之前)有限的時間量。

現在減少這個數量的最佳方法是什麼?

我不能這樣做在StreamListener,因爲總是有兩個流,它會減少兩次。

也許某種單身?

謝謝!

+0

您是否嘗試過在Wowza支持論壇發佈該問題?他們相當有幫助。 – Salman

+0

我會試一試。謝謝你的提示。 – nahri

回答

1

而不是單身人士,如果您的視頻聊天時間一旦開始聊天就不會改變,您可以實現一個模塊並在playpublish事件上附加TimerTask。以下是您幫助您入門的一個示例。

import java.util.Timer; 
import java.util.TimerTask; 

import com.wowza.wms.amf.AMFDataList; 
import com.wowza.wms.client.IClient; 
import com.wowza.wms.logging.WMSLogger; 
import com.wowza.wms.module.*; 
import com.wowza.wms.request.RequestFunction; 
import com.wowza.wms.stream.IMediaStream; 
import com.wowza.wms.stream.IMediaStreamActionNotify; 

public class KillAfterNSeconds extends ModuleBase implements IMediaStreamActionNotify { 

    private class StreamKiller extends TimerTask{  
     private IMediaStream stream;   
     public StreamKiller(IMediaStream s){ 
      this.stream = s; 
     }  
     @Override 
     public void run() { 
      try{ 
       // Complete all your clean up, such as : 
       if(stream != null){ 
        WMSLogger.getLogger("").info("Killing stream: " + stream.getName()); 
        stream.getClient().shutdownClient(); 
        stream.shutdown(); 
        stream.close(); 
       }    
      }catch(Exception e){} 
     } 
    } 

    public void publish(IClient paramIClient, 
      RequestFunction paramRequestFunction, AMFDataList paramAMFDataList) { 
     WMSLogger.getLogger("").info("Start running publish.."); 
     IMediaStream stream = getStream(paramIClient, paramRequestFunction); 
     stream.addClientListener(this); 
     Timer timer = new Timer(); 
     TimerTask task = new StreamKiller(stream); 
     // replace here with the actual time to kill stream 
     timer.schedule(task, 10000); 
     invokePrevious(paramIClient, paramRequestFunction, paramAMFDataList); 
     WMSLogger.getLogger("").info("Finish running publish.."); 
     return; 
    } 

    @Override 
    public void onUnPublish(IMediaStream stream, String streamName, 
      boolean isRecord, boolean isAppend) { 
     WMSLogger.getLogger("").info("Start onUnPublish.."); 
     double elapSeconds = stream.getElapsedTime().getTimeSeconds(); 
     WMSLogger.getLogger("").info("Elapsed time " + elapSeconds); 
     WMSLogger.getLogger("").info("Finish running onUnPublish.."); 
    } 

    @Override 
    public void onPause(IMediaStream arg0, boolean arg1, double arg2) {  
    } 
    @Override 
    public void onPlay(IMediaStream arg0, String arg1, double arg2, 
      double arg3, int arg4) { 
    } 
    @Override 
    public void onPublish(IMediaStream arg0, String arg1, boolean arg2, 
      boolean arg3) { 
    } 
    @Override 
    public void onSeek(IMediaStream arg0, double arg1) { 
    } 
    @Override 
    public void onStop(IMediaStream arg0) {  
    } 

} 
+0

好方法。我將不得不跟蹤(剩餘/已過)時間。我發現每個流對象都有一個ElapsedTime對象,跟蹤那個時間。但是,如果聊天結束_before_時間結束,我將不得不將差異保存到數據庫。我怎麼能做到最好? – nahri

+0

在'publish'方法中,您可以將一個客戶端偵聽器('IMediaStreamActionNotify')附加到流中,然後可以在聊天結束時通過'onUnPublish'函數獲取流逝的時間。我爲你修改了答案。您還可以向模塊添加一個字段,並在定時器任務運行時將該字段設置爲某個值。然後,您可以跟蹤定時器任務是否終止了聊天會話,還是在定時器之前終止了會話。 – ikikenis

+0

不是我所做過的確切結果,但是你幫了我很多,並且樂在其中。 – nahri