Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UPNP/DLNA控制点_Java_Android_Upnp_Dlna - Fatal编程技术网

Java UPNP/DLNA控制点

Java UPNP/DLNA控制点,java,android,upnp,dlna,Java,Android,Upnp,Dlna,我正在开发一个android UPnP/DLNA应用程序。我有一个控制点,可以将文件从媒体服务器流式传输到渲染器。我可以在播放过程中暂停/播放并停止文件,但我似乎不知道如何将seekbar集成到控制点,以显示播放文件的进度并能够与seekbar交互。我正在使用Cling Java库创建应用程序。如果有人有任何能帮助我的例子,我将非常感激 谢谢 我试图实现SubscriptionCallback示例并订阅LastChange SubscriptionCallback callback = new

我正在开发一个android UPnP/DLNA应用程序。我有一个控制点,可以将文件从媒体服务器流式传输到渲染器。我可以在播放过程中暂停/播放并停止文件,但我似乎不知道如何将seekbar集成到控制点,以显示播放文件的进度并能够与seekbar交互。我正在使用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);
但这将返回一个NullPointerException

有什么想法吗

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

我一直在尝试实现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");
                }
            });
        }

任何关于此操作失败原因的建议

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


至于交互,
Seek()
是您的朋友,理想的参数是
Unit=REL\u TIME
Target
=您所需的时间偏移。请注意,真实世界的渲染器可能不支持此搜索单元(模式)。也许它只支持TRACK_NR,在这种情况下,seekbar基本上是只读的。同样,对于特定的渲染器,Cling应该能够告诉您允许的
A_ARG\u TYPE_SeekMode

感谢您的帮助。我想知道你是否可以帮我处理Seek()我在编辑中添加了一些代码,显示我正在尝试将seekbar设置为一个新位置,然后从该位置调用play。当我拖动seebar位置时,它一直失败。请接受此答案并创建新问题。您最初的问题是“如何集成seekbar并能够与之交互”,您已经解决了这个问题。现在您的级别降低了一级,出现了特定于设备的问题。在新问题中,请说明您测试的具体DMR,并附加其DeviceDescription.xml。设备可能完全不支持REL_TIME seekmode。对此表示抱歉。这里有一个新问题:您好,目前,我正在搜索一个关于从Android将m3u8文件流到DLNA播放器的教程,但还没有找到任何好的起点。你能给我一些建议吗?提前谢谢。
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");
                }
            });
        }