首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UPNP/DLNA控制点

UPNP/DLNA控制点
EN

Stack Overflow用户
提问于 2012-07-22 16:39:32
回答 1查看 6K关注 0票数 2

我正在开发一个android UPnP/DLNA应用程序。我有一个控制点可以将文件从媒体服务器流到渲染器。我可以在播放过程中暂停/播放和停止文件,但我似乎不知道如何将查找栏集成到控制点以显示播放文件的进度,并能够与查找栏进行交互。我正在使用粘附Java库来创建这个应用程序。如果有人有任何能帮助我的例子,我将非常感激。

谢谢

我尝试实现SubscriptionCallback示例并订阅LastChange

代码语言:javascript
复制
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);

然后,我试图得到当前播放轨道的持续时间:

代码语言:javascript
复制
System.out.println("Duration: "+lastChange.getEventedValue(0, AVTransportVariable.CurrentTrackDuration.class).getValue());

但这将返回一个NullPointerException。

有什么想法吗?

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

我一直在努力实施“寻求”,但没有取得成功。

我有我的查找条和听者,但是当我将查找条拖到一个新的位置时,它就会失败。

代码语言:javascript
复制
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");
                }
            });
        }

有什么建议会失败的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-22 21:06:17

必须轮询呈现器以获取此类信息(请参阅AVTransport规范第2.3.1章)。规范鼓励每秒钟进行一次轮询,但是您可以很容易地阻塞一个真正的硬件渲染器( DLNA在a**中仍然是一个时髦的痛苦,而不是设计中的一个重要部分)。我们的既定做法是每2-3秒发送一次GetPositionInfo()请求,并仅将返回的RelativeTimePosition值作为对本地运行的计时器的调整。对于查找条大小,您还需要当前媒体的总长度。理想情况下,当您订阅AVTransport.LastChange时,渲染器会自动通知您。我不知道Cling是专门的,但是在controlpoint.SubscriptionCallback中,快速查看显示了一个很有希望的例子。不幸的是,对于真正的设备,LastChange通常不会告诉你什么。这些值要么根本不存在,要么具有恒定的惰性值。因此,您需要再次轮询GetMediaInfo()并使用MediaDuration值。

至于交互,Seek()是您的朋友,最好使用Unit = REL_TIMETarget =您想要的时间偏移的参数。请注意,一个真实世界的渲染者可能不支持这个单元(模式)的寻求。也许它只支持TRACK_NR,在这种情况下,查找条对于您来说是必需的只读的。同样,Cling应该能够告诉您特定呈现器的A_ARG_TYPE_SeekMode允许值。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11602069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档