[英]UPNP/DLNA Control Point
我正在使用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");
}
});
}
任何建议为什么会失败
您必须轮询渲染器以获取此类信息(请参阅AVTransport规范第2.3.1章 )。 规范鼓励每秒钟轮询一次,但是您可以轻松地阻塞真正的硬件渲染器(对于DLNA而言,DLNA仍然是设计中的时尚难题,而不是设计的重要组成部分)。 我们的惯例是每2-3秒发送GetPositionInfo()
请求,并将返回的RelativeTimePosition
值仅视为对本地运行计时器的调整。 对于搜索栏大小调整,您还需要当前媒体的总长度。 理想情况下,当您订阅AVTransport.LastChange
时,渲染器会自动告诉您。 我不特别了解Cling,但快速浏览一下即可在controlpoint.SubscriptionCallback
看到有希望的示例。 不幸的是,对于真实的设备, LastChange
通常不会告诉您太多信息。 这些值根本不存在或具有恒定的惰性值。 因此,您将需要再次轮询GetMediaInfo()
并使用MediaDuration
值。
至于交互, Seek()
是您的朋友,理想情况下,其参数为Unit = REL_TIME
和Target
=您所需的时间偏移。 请注意,现实世界中的渲染器可能不支持此搜索单位(模式)。 也许它仅支持TRACK_NR,在这种情况下,搜索栏对您来说本质上是只读的。 同样,Cling应该能够告诉您特定渲染器允许的A_ARG_TYPE_SeekMode
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.