无法浏览媒体服务器中的歌曲

时间:2015-01-07 12:35:32

标签: ios objective-c

目前正在开展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'中找不到

enter image description here

2 个答案:

答案 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