Sto tentando di modificare un'app per iOS in grado di inviare file audio (protetti/crittografati) ad altri dispositivi iOS. Utilizza AVAudioRecorder per registrare i file audio e utilizza AVAudioPlayer per riprodurre qualsiasi file audio ricevuto.AVAudioRecorder non crea file .m4a che possono essere aperti e riprodotti
Attualmente sto provando a modificare l'app per creare e inviare file compatibili con Android. Ho modificato il codice AVAudioRecorder esistente per questo:
[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey];
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dirPath = [paths objectAtIndex:0];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd HH-mm"];
NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]];
I file creati da questo sono riproducibili su un Mac, su un dispositivo iOS, ma non su un dispositivo Android. Se l'estensione del file è stata modificata manualmente per terminare in ".m4a", il file viene riprodotto su Android.
(Il vantaggio con il formato ".aac" è che le vecchie versioni di app possono ricevere questi file e riprodurli - ho mantenuto la compatibilità all'indietro.)
Così ho fatto questo cambiamento:
NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]];
Tuttavia, il file risultante (creato senza errori da AVAudioRecorder) non può essere riprodotto su Mac o dispositivi iOS. E sto aspettando di sapere se funziona su Android.
Quando AVAudioPlayer tenta di aprire il file, emette:
errore di dominio = Codice NSOSStatusErrorDomain = 1.685.348,671 mila "L'operazione potrebbe non essere completata (errore OSStatus 1685348671.)" Codice 1.685.348,671 mila -> "dta?": il file non è valido, non è un'istanza valida di un file audio del suo tipo o non è riconosciuto come file audio.
Rinominare semplicemente il file per avere un ".aac" di nuovo non cambia il fatto che non può essere caricato in alcunché su Mac o iOS.
In questo momento, sembra che la soluzione migliore sarebbe quella di creare un file ".aac", e quindi il terminale Android sostituire ".aac" con ".m4a" e provare a riprodurlo.
Domanda 1: Qualcuno sa perché la modifica dell'estensione del nome file può causare l'errore di AVAudioPLayer? BTW, il file ".m4a" che ho creato sopra, non può essere aperto con tutto ciò che ho sul Mac, quindi non posso dire se il problema è con il formato del file o l'impossibilità di iOS o Mac di leggere questo tipo di file .
Per chiunque sia curioso, ho messo una copia di un ".aac" e un file ".m4a" da AVAudioRecorder, qui:
https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac
Domanda 2: Anche se ho impostato AVAudioRecorder a uno canale, il file risultante è stereo. Perché? (Almeno questo è ciò che VLC dice sui metadati)
Domanda 3: È comunque necessario specificare AAC-LC per la codifica senza perdita di dati? O posso farlo solo se mi sposto da AVAudioRecorder a un'API di livello inferiore?
è utile: http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –
La risposta accettata su questa domanda è completamente sbagliata. Il file non è un vero file AAC. È solo avvolto in un m4a. Una delle altre risposte è corretta. Anche più utile è stata questa risposta: http://stackoverflow.com/a/12698691/86020 – mahboudz