2012-09-15 27 views
12

Tôi đang triển khai bản ghi âm. Nó hoạt động tốt với định dạng caf & wave. Nhưng vấn đề là kích thước tệp quá lớn.iOS: Định dạng tệp ghi âm âm thanh

Vì vậy, bất kỳ ai cũng có thể giúp tôi để ghi lại âm thanh có định dạng cũng được phát trong cửa sổ & kích thước tệp thấp.

Mã tôi đã cố gắng là dưới đây:

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

trùng lặp của http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format? – nneonneo

+0

Ghi ở định dạng m4a (MPEG-4 AAC). Xem http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format để biết chi tiết. – nneonneo

Trả lời

16

Tôi cũng đã cố gắng sử dụng AVAudioRecorder để ghi lại âm thanh trong định dạng được mã AAC tốt nhất trong một tập tin .m4a. Tôi đã nhanh chóng có thể lấy mã để ghi vào AAC bên trong một tệp âm thanh lõi (.caf), nhưng tôi không thể nhận được AVAudioRecorder để định dạng đúng .m4a. Tôi vừa viết lại mã ghi trong ứng dụng của mình bằng cách sử dụng API đơn vị âm thanh cấp thấp hơn nhưng thay vào đó tôi đặt nó trên đầu ghi ngược và được thêm vào trong mã để xử lý phiên âm thanh được chia sẻ. Một khi đã được thiết lập, tôi đã quay lại và cố gắng tiết kiệm như một .m4a và nó chỉ hoạt động.

Dưới đây là một số mã ví dụ:

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]; 

Sau đó, để kết thúc buổi ghi hình tôi đã sử dụng:

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

Sau đó, hồ sơ tại 'tmpFileUrl' có thể được sử dụng như bạn vui lòng.

+0

'setActive: withFlags: error:' không được chấp nhận sau iOS 6. Thay vào đó chúng ta có thể sử dụng 'setActive: error:' (không đặt cờ). Việc này ổn với tôi. – Vineeth

+0

Dude! Lưu ngày của tôi :) Tôi đang tạo một ứng dụng cho con tôi cho sinh nhật lần đầu tiên của cô ấy để cô ấy cảm ơn <3 –

+0

Thay đổi từ kAudioFormatMPEG4AAC thành kAudioFormatMPEG4AAC, thay đổi kích thước tệp từ 1.3MB thành 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

Dưới đây là các thiết lập của tôi cho chất lượng cao và kích thước tập tin nhỏ (trên cân bằng):

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

này mang đến cho bạn một chất lượng gần cd track mono AAC. Bạn nên nối thêm tệp với .m4a để có thể đọc được ở mọi nơi. Tất cả các thông số khác được đặt thành mặc định thiết bị, đó là những gì bạn muốn xảy ra trong hầu hết các trường hợp.

+0

Một lần nữa, điều này được sử dụng để làm việc tốt - nhưng bây giờ bị bóp méo với iOS10 nếu có bất kỳ mức độ đáng kể nào. Sử dụng iPad Pro –