2015-01-07 17 views
9

Obecnie pracuje nad projektem UpnP. Chcę włączyć iPoda touch w Media Server (na przykład: https://itunes.apple.com/in/app/arkmc-lite-dlna-upnp-media/id640095560?mt=8). Dlatego użyłem następującego zestawu SDK (link). Zintegrowaliśmy go pomyślnie i jest on wyświetlany na liście serwerów Media Server, ale kiedy klikam na serwerze, nie można przeglądać plików multimedialnych. Czy ktokolwiek może mi powiedzieć, jaki jest mój problem? Dzięki za poświęcony czasNie można przeglądać utworów z serwera mediów

Oto krótki kod

- (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; 
} 

także Dostaję jedną wiadomość w dzienniku jest NEPTUNE_LOG_CONFIG nie znajdują się w 'Info.plist'

enter image description here

+0

@vampirewalk chcę przeglądać za pomocą sieci nie używając MPMediaQuery. Możemy uzyskać dostęp za pomocą Upnp przy pomocy sieci. – Tendulkar

+0

Tak, masz rację Chcę Lokalnego DMS i ścieżek root – Tendulkar

+0

@vampirewalk Proszę, najpierw przeczytaj moje pytanie, a następnie daj mi swoje sugestie. Podany link jest już w moim pytaniu. – Tendulkar

Odpowiedz

2

Ty zdecydowanie powinien wdrożyć metody delegatów (onBrowseDirectChildren:, itp.) w jakiś przydatny sposób. Np. W przypadku onBrowseDirectChildren należy zidentyfikować wszystkie elementy, które należy zwrócić w odpowiedzi i utworzyć odpowiedź (listę adresów URL) z nimi. To wykracza daleko poza to, co można osiągnąć w odpowiedzi z powodu wielu zmiennych, które są w to zaangażowane.

Dobrym punktem wyjścia można byłoby dodanie następującego śladu dziennika, np onBrowseDirectChildren:

NSLog(@"UPnP: Received Browse DirectChildren request for object %@, with sort criteria %s - count %d", info.objectId, info.sort, info.count); 

Być może najlepszą rzeczą jaką możesz zrobić, to dać do obejrzenia jak XBMC realizuje its own media server na szczycie platyna.

4

Przepraszam za spóźnienie do wątku. Przyjrzałem się źródłu SDK, które dostarczyłeś. Próbowałem znaleźć przyczynę tego "800 błędów wewnętrznych". Oto co znalazłem:

W PltMediaServer.cpp dół wokół linii 434 jest ten bit:

if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { 
    action->SetError(800, "Internal error"); 
} 

tak, to co powoduje NPT_FAILED(res) być true? Spojrzałam z powrotem do źródła i okazało się, że na linii 424

res = OnBrowseDirectChildren(
    action, 
    object_id, 
    filter, 
    starting_index, 
    requested_count, 
    sort, 
    context); 

ale kod (a domyślny kod testowy też!) Ma

- (NPT_Result)onBrowseDirectChildren:(PLT_MediaServerBrowseCapsule*)info 
{ 
    return NPT_FAILURE; 
} 

i żaden inny wariant OnBrowseDirectChildren że mogę zobaczyć ze swojego kodu.

Domyślna implementacja tego jest w PltMediaServerObject.mm na linii 44:

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; 

... 

Więc uniknąć awarii, nie, ale wtedy ten bit przychodzi się na linii 62:

NPT_Result result = [[m_Target delegate] onBrowseDirectChildren:capsule]; 

i tym to jest, gdzie twój NPT_FAILURE zostanie zwrócony, co zablokuje przeglądanie multimediów.


Jest inny sposób może wystąpić ten błąd, on line 415 PltMediaServer.cpp jest

res = OnBrowseMetadata(...); 

ale ponownie kod jest podobny do tego z żadnych innych wariantów.

- (NPT_Result)onBrowseMetadata:(PLT_MediaServerBrowseCapsule*)info 
{ 
    return NPT_FAILURE; 
} 

i to doprowadzi do podobnego błędu.


Tak voilà, wyjaśnienie, dlaczego otrzymujesz 800 błędów wewnętrznych. Moje zalecenie, zaimplementuj je.

Oto przykładowe implementacje tych metod można pożyczyć lub inżynierii wstecznej:

Powiązane problemy