2012-07-22 125 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