2013-07-08 10 views
9

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?

+1

è utile: http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

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

risposta

8

La risposta alla domanda 1 è che è necessario impostare correttamente la sessione audio, altrimenti il ​​file m4a non viene formattato correttamente.Il codice sessione audio che ora impostata, poco prima di iniziare la registrazione è:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

ho impostato la seduta posteriore per la riproduzione dopo la registrazione è terminata in modo che i file audio possono essere riprodotti.

Domanda 2 è un problema in VLC che stava visualizzando il numero errato di canali. Il file audio, nella finestra Ottieni informazioni del Finder di MacOS, viene visualizzato come singolo canale.

La domanda 3 non ha risposta.

+0

mahboubz La grande chiamata sul punto 1 ha risolto completamente il mio problema! –

3

Per creare e registrare l'audio in file ".m4a", che svolgono in iOS, così come in Android, io uso seguente codice:

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil]; 
[AudioRecorder setDelegate:self]; 
[AudioRecorder recordForDuration:RecordLimitTime]; // Record Limit if require 
if ([AudioRecorder prepareToRecord]) { 
    [AudioRecorder record]; 
} 

Nel lato Android, non c'è bisogno di cambiare la il codice per riprodurre solo il file ".mp3", in Android basta cambiare l'estensione da "fileName.m4a" a "fileName.mp3", e funziona sorprendentemente.e nel file iOS = "fileName.m4a" funziona senza intoppi.

Problemi correlati