2

我正在开发一个 android UPnP/DLNA 应用程序。我有一个控制点,可以在其中将文件从媒体服务器流式传输到渲染器。我可以在播放过程中暂停/播放和停止文件,但我似乎无法弄清楚如何将搜索栏集成到控制点以显示播放文件的进度并能够与搜索栏进行交互。我正在使用 Cling Java 库来创建应用程序。如果有人有任何可以帮助我的例子,我将不胜感激。

谢谢

我尝试实现 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。

有任何想法吗???????

** * ** * ** * ** *更新* ** * ** * ** * *

我一直在尝试实现 Seek() 但没有成功。

我有我的搜索栏和侦听器,但是当我将搜索栏拖到新位置时它一直失败。

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");
                }
            });
        }

任何建议为什么这会失败

4

1 回答 1

6

您必须轮询渲染器以获取此类信息(请参阅AVTransport 规范第 2.3.1 章)。该规范鼓励每秒轮询一次,但您可以轻松地阻塞一个真正的硬件渲染器(DLNA 在 a** 中仍然是一种时尚的痛苦,而不是设计的重要部分)。我们既定的做法是GetPositionInfo()每 2-3 秒发送一次请求,并将返回RelativeTimePosition值仅视为对本地运行计时器的调整。对于搜索栏大小,您还需要当前媒体的总长度。理想情况下,当您订阅AVTransport.LastChange. 我不具体了解 Cling,但快速浏览一下在controlpoint.SubscriptionCallback. 不幸的是,对于真实的设备,LastChange通常不会告诉你太多事情。这些值要么根本不存在,要么具有恒定的惰性值。因此,您将需要GetMediaInfo()再次轮询并使用MediaDuration值。

至于交互,Seek()是你的朋友,理想情况下,参数Unit = REL_TIMETarget= 你想要的时间偏移。请注意,现实世界的渲染器可能不支持这种搜索单元(模式)。也许它只支持 TRACK_NR 在这种情况下,搜索栏对您来说基本上是只读的。同样,Cling 应该能够告诉您A_ARG_TYPE_SeekMode特定渲染器的允许值。

于 2012-07-22T21:06:17.313 回答