2013-04-25 13 views
5

Ho creato un'app che riproduce musica utilizzando AVAudioPlayer. Carica o scarica i brani, li scrive su Core Data, quindi li richiama per giocare quando selezionato. Tutte le quindici canzoni che ho testato funzionano normalmente usando sia l'iPhone Music Client che il mio computer.AudioPlayer iOS e m4a

Tuttavia, tre di essi non vengono riprodotti nell'app. Nello specifico, posso caricare queste quindici canzoni in qualsiasi ordine, svuotare il mio Model.sqlite, scaricarle nuovamente nell'app e scoprire che tre di loro semplicemente non suonano. Tuttavia, hanno il titolo e l'artista giusti.

Guardando in questo, ho notato che la differenza è che i file non funzionanti sono .m4a. Come riprodurre file di quel formato con AVAudioPlayer?

EDIT ("cosa 'fare memoria', che cosa URL si inizializza AVAudioPlayer con?"?):

C'è un server con le canzoni che l'utente può accedere attraverso l'applicazione. Dopo aver scelto il sottoinsieme S da recuperare, l'app scarica S e lo scrive su un CoreModel utilizzando NSManagedObjectContext. Ogni canzone è memorizzata come entità separata con un ID univoco e una relazione con un'entità sottoinsieme (in questo caso, S).

Quando "richiama" l'AppDelegate per ottenere la canzone giusta utilizzando il contesto, vengono restituiti anche i dati. Ho poi inizializzare l'AVAudioPlayer in questo modo:

[[AVAudioPlayer alloc] initWithData:(NSData *)[currentSong valueForKey:@"data"] error:nil]; 

... Così ho scritto questo e poi si rese conto che non ho effettivamente controllato che cosa l'errore è (stupido me). Ho scoperto che è OSStatus error 1954115647, che restituisce come Tipo file non supportato. Guardando in questo un po 'di più, ho trovato questo iPhone: AVAudioPlayer unsupported file type. Una soluzione viene presentata lì come ritagliare i dati errati all'inizio o inizializzarli dal contenuto di un URL. È possibile trovare dove sono scritti i dati nel modello di base per alimentare quello come l'URL?

EDIT: (. Confronta i file sono diversi?)

Sì, lo sono. Sto catturando un file .m4a di esempio dal mio server, che è stato caricato dall'app e confrontandolo con quello di iTunes. Quello che ho trovato è che il file viene troncato prima dell'offset 229404 (su 2906191 byte), che inizia con 20680001 A0000E21. Nella versione di iTunes, 0028D83B 6D646174 si trova prima di quei byte. Prima che sia un grande blocco di zeri preceduto da un grande blocco di dati preceduto dalle informazioni di codifica di iTunes. In cima c'è più informazioni sulla codifica che elencano il file come M4A.

risposta

0

Sei sicuro che il tuo codec sia supportato in iOS? AVAudioPlayer deve riprodurre qualsiasi formato supportato da iOS, puoi leggere l'elenco dei formati supportati qui: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html#//apple_ref/doc/uid/TP40009767-CH2-SW6.

Ti suggerisco di provare manualmente ad aggiungere quei file al dispositivo tramite iTunes e riprodurli su iPod, se non verranno riprodotti, il problema non è il tuo codice o sdk, ma il formato.

+0

Sì, .m4a è supportato in iOS e tutti i file non hanno problemi a giocare su iPhone con mezzi regolari. – user592419

0

Come stai richiamandoli a suonare - stai scrivendo in un file temporaneo che ha un'estensione m4a - questa estensione m4a è probabilmente richiesta.

+0

Sto scrivendoli ai dati principali, digitati da un ID univoco e quindi richiamandoli quando è il momento di giocare tramite quell'ID. – user592419

+0

Che cosa "richiama?", Quale URL inizializza con AVAudioPlayer? –

+0

Modificato per riflettere la domanda e altro. – user592419

0

Questa non è una soluzione diretta, ma probabilmente è shouldn't be saving the blobs in Core Data direttamente. Scrivi i file in una posizione memorizzata nella cache e salva i percorsi dei file in Dati principali. Ciò consentirà di utilizzare il database in modo più efficiente e di fornire un percorso file locale da assegnare a AVAudioPlayer, che eviterà il problema.

+0

Oppure, se si utilizza l'opzione in Dati principali per consentire l'archiviazione esterna, è possibile trovare la posizione seguendo questa risposta: http://stackoverflow.com/questions/9801944/storing-blobs-in-external-location-using -built-in-coredata-opzione ma che si applicherà solo agli oggetti di una certa dimensione (attualmente 1 MB) – Don

+0

Ho regolato l'app per lavorare st Salvare i dati in una posizione dati url locale e quindi salvare quella stringa nel coremodel. Funziona con canzoni normali, ma non funziona con m4a. Ho trovato questo, http://stackoverflow.com/questions/10545658/m4a-raw-data-from-ipod-library-not-playing, che sembra descrivere lo stesso problema. Quando eseguo un'esportazione, ottengo un file più grande che include le informazioni dell'intestazione, ma ora sto correndo in un altro problema con s3 putObject che non riesce a riceverlo. – user592419