2012-09-15 9 views
12

Wdrażam nagranie audio. Działa dobrze z formatem caf & . Problem polega jednak na tym, że rozmiar pliku jest zbyt duży.iOS: Format pliku zapisu dźwięku

Czy ktoś może mi pomóc w nagrywaniu dźwięku z formatem, który również był odtwarzany w oknie? Rozmiar pliku jest niewiele niższy.

Kod Próbowałem jest poniżej:

dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 
    NSString *soundFilePath = [docsDir 
           stringByAppendingPathComponent:@"sound.wave"]; 
    NSLog(@"%@",soundFilePath); 
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

    NSDictionary *recordSettings = [NSDictionary 
         dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithInt:AVAudioQualityMin], 
            AVEncoderAudioQualityKey, 
            [NSNumber numberWithInt:16], 
            AVEncoderBitRateKey, 
            [NSNumber numberWithInt: 2], 
            AVNumberOfChannelsKey, 
            [NSNumber numberWithFloat:8000.0], AVSampleRateKey, 
            [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey, 
            nil]; 

    NSError *error = nil; 

    audioRecorder = [[AVAudioRecorder alloc] 
         initWithURL:soundFileURL 
         settings:recordSettings 
         error:&error]; 

    if (error) 
    { 
     NSLog(@"error: %@", [error localizedDescription]); 

    } else { 
     [audioRecorder prepareToRecord]; 
    } 
+0

duplikat http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format? – nneonneo

+0

Nagrywanie w formacie m4a (MPEG-4 AAC). Szczegółowe informacje można znaleźć na stronie http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format. – nneonneo

Odpowiedz

16

ja również próbował użyć AVAudioRecorder do nagrywania dźwięku w formacie AAC kodowanego najlepiej w pliku .m4a. Szybko udało mi się uzyskać kod do nagrywania w formacie AAC w głównym pliku audio (.caf), ale nie mogłem zmusić AVAudioRecorder do odpowiedniego sformatowania .m4a. Miałem właśnie przepisać kod nagrywania w mojej aplikacji za pomocą interfejsu API niższych jednostek Audio Unit, ale zamiast tego umieściłem to na odwrocie i dodałem kod, aby obsłużyć wspólną sesję audio. Po skonfigurowaniu wróciłem i próbowałem zapisać jako .m4a i po prostu zadziałało.

Oto przykładowy kod:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]]; 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
         [NSNumber numberWithFloat:16000.0], AVSampleRateKey, 
         [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
         nil]; 
NSError *error = nil; 
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error]; 
[recorder prepareToRecord]; 

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

[recorder record]; 

Następnie, aby zakończyć nagrywanie użyłem:

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

Następnie plik na „tmpFileUrl” może być używany jak należy.

+0

'setActive: withFlags: error:' jest przestarzałe po iOS 6. Zamiast tego możemy użyć 'setActive: error:' (bez ustawiania flag). Działa to dobrze dla mnie. – Vineeth

+0

Koleś! Uratowałem mój dzień :) Tworzę aplikację dla mojego dziecka na jej pierwsze urodziny, więc ona ci dziękuje <3 –

+0

Zmiana z kAudioFormatMPEG4AAC na kAudioFormatMPEG4AAC, zmienia rozmiar pliku z 1.3MB na 45kb – Thiru

1
NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithCapacity:0]; 

[settings setValue :[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[settings setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey]; 
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 
[settings setValue :[NSNumber numberWithInt:8] forKey:AVLinearPCMBitDepthKey]; 
[settings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
[settings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; 

//Encoder 

[settings setValue :[NSNumber numberWithInt:12000] forKey:AVEncoderBitRateKey]; 
[settings setValue :[NSNumber numberWithInt:8] forKey:AVEncoderBitDepthHintKey]; 
[settings setValue :[NSNumber numberWithInt:8] forKey:AVEncoderBitRatePerChannelKey]; 
[settings setValue :AVAudioQualityMin   forKey:AVEncoderAudioQualityKey]; 
6

Oto moje ustawienia wysokiej jakości i małym rozmiarze pliku (w bilansie):

NSDictionary *recordSettings = @{AVEncoderAudioQualityKey: @(AVAudioQualityMedium), 
           AVFormatIDKey: @(kAudioFormatMPEG4AAC), 
           AVEncoderBitRateKey: @(128000), 
           AVNumberOfChannelsKey: @(1), 
           AVSampleRateKey: @(44100)}; 

To daje blisko jakości CD torze mono AAC. Powinieneś dołączyć plik .m4a, aby był czytelny wszędzie. Wszystkie inne parametry zostają ustawione na domyślne ustawienia urządzenia, co w większości przypadków ma miejsce.

+0

Znowu to działało dobrze - ale teraz jest zniekształcone przez iOS10, jeśli jest jakiś znaczący poziom. Korzystanie z iPada Pro –