2012-07-22 45 views
2

我正在開發Android UPnP/DLNA應用程序。我有一個控制點,可以將文件從媒體服務器傳輸到渲染器。我可以在播放過程中暫停/播放和停止文件,但我似乎無法弄清楚如何將一個搜索欄集成到控制點以顯示播放文件的進度並能夠與搜索欄進行交互。我正在使用Cling Java庫來創建應用程序。如果有人有任何可以幫助我的例子,我會非常感激。UPNP/DLNA控制點

感謝

我試圖實現SubscriptionCallback例子,訂閱LastChange

SubscriptionCallback callback = new SubscriptionCallback(service, 600) { // Timeout in seconds 

       public void established(GENASubscription sub) { 
        System.out.println("Established: " + sub.getSubscriptionId()); 


       } 
       @Override 
       public void failed(GENASubscription sub, UpnpResponse response, Exception ex) { 
        System.err.println(
         createDefaultFailureMessage(response, ex) 
        ); 
       } 
       @Override 
       public void ended(GENASubscription sub, CancelReason reason, UpnpResponse response) { 
        // Reason should be null, or it didn't end regularly 
       } 

       public void eventReceived(GENASubscription sub) { 
        System.out.println("Event: " + sub.getCurrentSequence().getValue()); 


           try { 
            lastChange = new LastChange(
              new AVTransportLastChangeParser(), 
              sub.getCurrentValues().get("LastChange").toString() 
            ); 


           } catch (Exception ex) { 
            log.warning("Error parsing LastChange event content: " + ex); 
            return; 
           } 

        Map<String, StateVariableValue> values = sub.getCurrentValues(); 
        StateVariableValue status = values.get("Status"); 
        System.out.println("Status is: " + status.toString()); 
       } 

       public void eventsMissed(GENASubscription sub, int numberOfMissedEvents) { 
        System.out.println("Missed events: " + numberOfMissedEvents); 
       } 
       @Override 
       protected void failed(GENASubscription arg0, 
         UpnpResponse arg1, Exception arg2, String arg3) { 

       } 
      }; 

      upnpService.getControlPoint().execute(callback); 

然後我試圖讓當前播放曲目的持續時間:

System.out.println("Duration: "+lastChange.getEventedValue(0, AVTransportVariable.CurrentTrackDuration.class).getValue()); 

但這返回一個NullPointerException。

任何想法???????

** * ** * ** * ** *UPDATE* ** * ** * ** * *

我一直在試圖實現Seek(),但沒有成功。

我有我的seekbar和listener,但是當我將seekbar拖到一個新的位置時它會一直失敗。

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
{ 
     @Override 
     public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) 
     { 
      Log.i("SEEKTIME", "time:" + arg1); 
      upnpService.getControlPoint().execute(new Seek(service, SeekMode.REL_TIME, arg0.toString()) 
      { 
       @Override 
       public void success(ActionInvocation invocation) 
       { 
        //super.success(invocation); 
        Log.i("SEEKSUCCESS", "success seek"); 
       } 
       @Override 
       public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) 
       { 
        Log.i("SEEKFAIL", "fail seek"); 
       } 
      }); 
     } 

任何爲什麼會失敗

+0

嗨,目前,我正在尋找一個關於流m3u8文件到Android的DLNA播放器的教程,但仍然沒有找到任何好的起點。你能給我一些建議嗎?提前致謝。 – ByulTaeng 2016-03-30 10:50:13

回答

6

您必須輪詢這種信息的渲染器(見AVTransport spec chapter 2.3.1)的建議。規範鼓勵每秒輪詢,但是你可以很容易地阻塞一個真正的硬件渲染器(對於這個渲染器來說,DLNA在設計中比起設計中至關重要的部分來說仍然是一種時髦的痛苦)。我們的慣例是每2-3秒發送GetPositionInfo()請求,並將返回的RelativeTimePosition值僅作爲對本地運行計時器的調整。對於seekbar大小,您還需要當前媒體的總長度。理想情況下,當您訂閱AVTransport.LastChange時,渲染器會自動告訴您。我不知道Cling具體是什麼,但快速查看在controlpoint.SubscriptionCallback中顯示出有希望的例子。不幸的是,真正的設備,LastChange往往不會告訴你什麼。這些值根本不存在或具有恆定的惰性值。因此,您需要再次輪詢GetMediaInfo()並使用MediaDuration值。

至於互動,Seek()是你的朋友,理想的參數爲Unit = REL_TIMETarget =你想要的時間偏移量。請注意,真實世界的渲染器可能不支持尋找這個單元(模式)。也許它只支持TRACK_NR,在這種情況下,seekbar對於您來說是基本只讀的。 Cling應該能夠告訴您特定渲染器允許的值A_ARG_TYPE_SeekMode

+0

感謝您的幫助。我想知道你是否可以幫助我Seek()我已經在編輯中添加了一些代碼,這表明我試圖將seekbar設置到一個新的位置,然後從該位置調用播放。當我拖動seebar位置時,它會一直失敗。 – 2012-08-09 21:09:31

+0

請接受這個答案並創建新的問題。你原來的問題是「如何整合seekbar,並能夠與它互動」,你想通了。現在你降低了一個級別,具有設備特定的問題。在新的問題中,說出您要測試的特定DMR,並附加其DeviceDescription.xml。該設備可能絕對有可能不支持REL_TIME seekmode。 – 2012-08-10 10:37:22

+0

對不起。新問題在這裏:http://stackoverflow.com/questions/11900315/upnp-seek-and-seekbar-for-android-application – 2012-08-10 11:14:10