gpt4 book ai didi

java - UPNP/DLNA 控制点

转载 作者:太空狗 更新时间:2023-10-29 16:22:13 26 4
gpt4 key购买 nike

我正在开发一款安卓 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 spec chapter 2.3.1 )。该规范鼓励每秒进行一次轮询,但您可以轻松地阻塞一个真正的硬件渲染器(为此,DLNA 仍然是 a** 中的一个时髦的痛苦,而不是设计的重要部分)。我们的既定做法是每 2-3 秒发送一次 GetPositionInfo() 请求,并将返回的 RelativeTimePosition 值仅视为对本地运行计时器的调整。对于搜索栏大小,您还需要当前媒体的总长度。理想情况下,渲染器会在您订阅 AVTransport.LastChange 时自动告诉您。我不太了解 Cling,但快速浏览一下就会看到 controlpoint.SubscriptionCallback 中的示例。不幸的是,对于真实设备,LastChange 通常不会告诉您任何信息。这些值要么根本不存在,要么具有恒定的惰性值。因此,您需要再次轮询 GetMediaInfo() 并使用 MediaDuration 值。

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

关于java - UPNP/DLNA 控制点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com