Как записать звук на iPhone с помощью AVAudioRecorder?

SQL де-факто.

Рамки, которые пытаются защитить разработчиков от этого, в конечном итоге создали свой собственный язык (Hibernate HQL приходит на ум).

SQL решает проблему довольно хорошо. Изучение не сложнее, чем язык программирования высокого уровня. Если вы уже знаете функциональный язык, тогда вам нужно понять SQL.

Учитывая, что ведущие поставщики баз данных, предоставляющие современные базы данных (Oracle и SQL Server) поддерживают SQL и вкладывают годы в механизмы оптимизации, и т. д., и все ведущие программы моделирования данных и программного обеспечения для управления изменениями заключаются в SQL, я бы сказал, что это самая безопасная ставка.

Кроме того, база данных больше, чем просто запросы. Существует масштабируемость, резервное копирование и восстановление, интеллектуальный анализ данных. Крупные продавцы поддерживают многие вещи, которые даже новые «кеш-движки» даже не рассматривают.

146
задан swiftBoy 7 June 2016 в 10:41
поделиться

2 ответа

На самом деле примеров нет вообще. Вот мой рабочий код. Запись запускается при нажатии пользователем кнопки на панели навигации. При записи используется качество cd (44100 сэмплов), стерео (2 канала), линейный pcm. Осторожно: если вы хотите использовать другой формат, особенно закодированный, убедитесь, что вы полностью понимаете, как установить настройки AVAudioRecorder (внимательно прочтите документацию по типам аудио), иначе вы никогда не сможете правильно его инициализировать. Еще кое-что. В коде я не показываю, как обрабатывать данные измерений, но вы можете легко это понять. Наконец, обратите внимание, что метод deleteRecording в AVAudioRecorder на момент написания этой статьи приводит к сбою вашего приложения. Вот почему я удаляю записанный файл через файловый менеджер. Когда запись закончена, я сохраняю записанный звук как NSData в текущем редактируемом объекте с помощью KVC.

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]


- (void) startRecording{

UIBarButtonItem *stopButton = [[UIBarButtonItem alloc] initWithTitle:@"Stop" style:UIBarButtonItemStyleBordered  target:self action:@selector(stopRecording)];
self.navigationItem.rightBarButtonItem = stopButton;
[stopButton release];

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}
[audioSession setActive:YES error:&err];
err = nil;
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}

recordSetting = [[NSMutableDictionary alloc] init];

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

[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];



// Create a new dated file
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [now description];
recorderFilePath = [[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, caldate] retain];

NSURL *url = [NSURL fileURLWithPath:recorderFilePath];
err = nil;
recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
if(!recorder){
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: [err localizedDescription]
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [alert show];
    [alert release];
    return;
}

//prepare to record
[recorder setDelegate:self];
[recorder prepareToRecord];
recorder.meteringEnabled = YES;

BOOL audioHWAvailable = audioSession.inputIsAvailable;
if (! audioHWAvailable) {
    UIAlertView *cantRecordAlert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: @"Audio input hardware not available"
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [cantRecordAlert show];
    [cantRecordAlert release]; 
    return;
}

// start recording
[recorder recordForDuration:(NSTimeInterval) 10];

}

- (void) stopRecording{

[recorder stop];

NSURL *url = [NSURL fileURLWithPath: recorderFilePath];
NSError *err = nil;
NSData *audioData = [NSData dataWithContentsOfFile:[url path] options: 0 error:&err];
if(!audioData)
    NSLog(@"audio data: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
[editedObject setValue:[NSData dataWithContentsOfURL:url] forKey:editedFieldKey];   

//[recorder deleteRecording];


NSFileManager *fm = [NSFileManager defaultManager];

err = nil;
[fm removeItemAtPath:[url path] error:&err];
if(err)
    NSLog(@"File Manager: %@ %d %@", [err domain], [err code], [[err userInfo] description]);



UIBarButtonItem *startButton = [[UIBarButtonItem alloc] initWithTitle:@"Record" style:UIBarButtonItemStyleBordered  target:self action:@selector(startRecording)];
self.navigationItem.rightBarButtonItem = startButton;
[startButton release];

}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{

NSLog (@"audioRecorderDidFinishRecording:successfully:");
// your actions here

}
206
ответ дан 23 November 2019 в 22:42
поделиться

Хорошо, полученный мной ответ помог мне в правильном направлении, и я очень благодарен. Это помогло мне понять, как на самом деле записывать на iPhone, но я подумал, что также включу некоторый полезный код, который я получил из справочной библиотеки iPhone:

AudioandVideoTechnologies

Я использовал этот код и справедливо добавил его в пример avTouch без труда. С помощью приведенного выше примера кода и образца из справочной библиотеки я смог заставить это работать очень хорошо.

2
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: