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.
Sì, .m4a è supportato in iOS e tutti i file non hanno problemi a giocare su iPhone con mezzi regolari. – user592419