目前正在开展UpnP项目。我想将我的iPod touch变成媒体服务器(例如:https://itunes.apple.com/in/app/arkmc-lite-dlna-upnp-media/id640095560?mt=8)。所以我使用了以下SDK(link)。我已成功集成,它显示在媒体服务器列表中,但是当我点击服务器时,它无法浏览媒体文件。有谁可以让我知道我的问题是什么?谢谢你的时间
这是一些简短的代码
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
upnp = [[PLT_UPnPObject alloc] init];
// create server and add ourselves as the delegate
PLT_MediaServerObject* server = [[PLT_MediaServerObject alloc] init];
[server setDelegate:self];
[upnp addDevice:server];
}
- (IBAction)performUPnPStarStop:(id)sender {
if ([upnp isRunning]) {
[upnp stop];
[mainButton setTitle:@"Start" forState:UIControlStateNormal];
} else {
[upnp start];
[mainButton setTitle:@"Stop" forState:UIControlStateNormal];
}
}
#pragma mark PLT_MediaServerDelegateObject
- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info
{
return NPT_FAILURE;
}
- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info
{
return NPT_FAILURE;
}
- (NPT_Result)onSearchContainer:(PLT_MediaServerSearchCapsule*)info
{
return NPT_FAILURE;
}
- (NPT_Result)onFileRequest:(PLT_MediaServerFileRequestCapsule*)info
{
return NPT_FAILURE;
}
此外,我在日志中收到一条消息 NEPTUNE_LOG_CONFIG在'Info.plist'中找不到
答案 0 :(得分:4)
抱歉,我迟到了。我看了你提供的SDK源代码。我试图找出可能导致这种“800内部错误”的原因。这是我发现的:
在第434行的PltMediaServer.cpp
下方有这一位:
if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
action->SetError(800, "Internal error");
}
那么是什么导致NPT_FAILED(res)
成为true
?我回顾了源头,发现第424行
res = OnBrowseDirectChildren(
action,
object_id,
filter,
starting_index,
requested_count,
sort,
context);
但您的代码(以及默认测试代码也是如此!)
- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info
{
return NPT_FAILURE;
}
并且我可以从您的代码中看到OnBrowseDirectChildren
的其他变体。
第44行的PltMediaServerObject.mm
默认实现:
NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
const char* object_id,
const char* filter,
NPT_UInt32 starting_index,
NPT_UInt32 requested_count,
const char* sort_criteria,
const PLT_HttpRequestContext& context) {
if (![[m_Target delegate] respondsToSelector:@selector(onBrowseDirectChildren:)])
return NPT_FAILURE;
...
所以你避免那里的失败条件,但是这一点出现在第62行:
NPT_Result result = [[m_Target delegate] onBrowseDirectChildren:capsule];
这就是你的NPT_FAILURE
将被退回的地方,这将会阻止媒体浏览。
还有另一种方法可能发生此错误,在PltMediaServer.cpp
的第415行有
res = OnBrowseMetadata(...);
但你的代码再次如此,没有其他变种。
- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info
{
return NPT_FAILURE;
}
这将导致类似的错误情况。
vo vo,,解释为什么你得到800内部错误。我的建议,实施它们。
以下是您可以借用或逆向工程的所述方法的示例实现:
答案 1 :(得分:2)
您应该以一些有用的方式实现您的委托方法(onBrowseDirectChildren:
等)。例如,对于onBrowseDirectChildren
,您应该识别响应中需要返回的所有项目,并使用它们构建响应(URL列表)。
现在,由于涉及许多变量,这远远超出了答案中可以实现的范围。
一个很好的起点是将以下日志跟踪添加到例如onBrowseDirectChildren
:
NSLog(@"UPnP: Received Browse DirectChildren request for object %@, with sort criteria %s - count %d", info.objectId, info.sort, info.count);
可能,你能做的最好的事情就是看看XBMC如何在铂金之上实现its own media server。