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