2015-01-07 18 views
9

Attualmente sta lavorando al progetto UpnP. Voglio trasformare il mio iPod touch in Media Server (ad esempio: https://itunes.apple.com/in/app/arkmc-lite-dlna-upnp-media/id640095560?mt=8). Così ho usato il seguente SDK (link). Ho integrato con successo e viene visualizzato nell'elenco dei server multimediali, ma quando faccio clic sul server non è in grado di sfogliare i file multimediali. Qualcuno potrebbe farmi sapere qual è il mio problema? Grazie per il tempoImpossibile sfogliare i brani da Media Server

Ecco alcune brevi codice

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

Anche io sono sempre un messaggio nel registro viene NEPTUNE_LOG_CONFIG non si trovano in 'Info.plist'

enter image description here

+0

@vampirewalk voglio navigare utilizzando la rete non utilizzando il MPMediaQuery. Possiamo accedere utilizzando Upnp con l'aiuto della rete. – Tendulkar

+0

Sì, hai ragione Voglio DMS locali e percorsi root – Tendulkar

+0

@vampirewalk Ti chiedo di leggere prima la mia domanda e poi darmi i tuoi suggerimenti. Il link che hai fornito è già nella mia domanda. – Tendulkar

risposta

2

È dovrebbe sicuramente implementare i metodi dei delegati (onBrowseDirectChildren:, ecc.) in qualche modo utile. Ad esempio, per onBrowseDirectChildren, è necessario identificare tutti gli elementi che devono essere restituiti nella risposta e creare la risposta (un elenco di URL) con essi. Ora, questo va ben oltre ciò che si può ottenere in una risposta a causa delle molte variabili coinvolte.

Un buon punto di partenza per si sarebbe aggiunta la seguente traccia di registro per, ad esempio, onBrowseDirectChildren:

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

Forse, la cosa migliore che si possa fare è dare uno sguardo a come XBMC implementa its own media server in cima platino.

4

Scusate il ritardo della discussione. Ho dato un'occhiata alla fonte SDK che hai fornito. Ho provato a dare la caccia a ciò che potrebbe causare questo "800 errore interno". Ecco cosa ho trovato:

In PltMediaServer.cpp verso il basso attorno alla riga 434 c'è questo bit:

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

così allora che cosa provoca NPT_FAILED(res) essere true? Ho guardato indietro nella fonte e ho scoperto che on line 424

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

ma il codice (e il codice di prova di default troppo!) Ha

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

e nessun altra variante di OnBrowseDirectChildren che posso vedere dal tuo codice.

L'implementazione predefinita di questo è in PltMediaServerObject.mm sulla linea 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; 

... 

in modo da evitare la condizione di errore c'è, ma poi questo bit viene in su sulla linea 62:

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

e che è dove verrà restituito il tuo NPT_FAILURE che bloccherà la navigazione multimediale.


C'è un altro modo potrebbe verificarsi questo errore, sulla linea 415 di PltMediaServer.cpp c'è

res = OnBrowseMetadata(...); 

ma il codice è di nuovo in questo modo, senza altre varianti.

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

e questo porterà a una condizione di errore simile.


Quindi voilà, una spiegazione del motivo per cui si ottengono 800 errori interni. La mia raccomandazione, li implementa.

Ecco di un esempio di detti metodi che è possibile prendere in prestito o decodificare:

Problemi correlati