Записывайте аудио и сохраняйте постоянно в iOS
Я сделал 2 приложения для iPhone, которые могут записывать аудио, сохранять его в файл и воспроизводить снова.
Один из них использует AVAudiorecorder и AVAudioplayer. Второй пример Apple SpeakHere с аудио-очередями.
Оба работают на Simulater, а также на устройстве.
НО при перезапуске любого приложения записанный файл не найден!!! Я перепробовал все возможные предложения, найденные в stackru, но он все еще не работает!
Это то, что я использую для сохранения файла:
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound1.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
1 ответ
Хорошо, я наконец решил это. Проблема была в том, что я настраивал AVAudioRecorder и указывал путь в viewLoad моего ViewController.m, перезаписывая существующие файлы с тем же именем.
- После записи и сохранения аудио в файл и остановки приложения я смог найти файл в Finder. (/Users/xxxxx/ Библиотека / Поддержка приложений /iPhone Simulator/6.0/ Приложения /0F107E80-27E3-4F7C-AB07-9465B575EDAB/Documents/sound1.caf)
Когда я перезапускаю приложение, код установки для рекордера (из viewLoad) просто перезаписывает мой старый файл с именем:
sound1.caf
с новым. То же имя, но без содержания.
Воспроизведение будет просто воспроизвести пустой новый файл. -> Нет звука, очевидно.
Итак, вот что я сделал:
Я использовал NSUserdefaults, чтобы сохранить путь к имени записанного файла, который будет получен позже в моем методе playBack.
убрал viewLoad в ViewController.m:
- (void)viewDidLoad
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[audioSession setActive:YES error:nil];
[recorder setDelegate:self];
[super viewDidLoad];
}
отредактированная запись во ViewController.m:
- (IBAction) record
{
NSError *error;
// Recording settings
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
[settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[settings setValue: [NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
[settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
[settings setValue: [NSNumber numberWithInt: AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];
NSArray *searchPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex: 0];
NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]];
// File URL
NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH];
//Save recording path to preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setURL:url forKey:@"Test1"];
[prefs synchronize];
// Create recorder
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
[recorder prepareToRecord];
[recorder record];
}
отредактировано воспроизведение в ViewController.m:
-(IBAction)playBack
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
//Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
temporaryRecFile = [prefs URLForKey:@"Test1"];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
player.delegate = self;
[player setNumberOfLoops:0];
player.volume = 1;
[player prepareToPlay];
[player play];
}
и добавил новый метод dateString в ViewController.m:
- (NSString *) dateString
{
// return a formatted string for a file name
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"ddMMMYY_hhmmssa";
return [[formatter stringFromDate:[NSDate date]] stringByAppendingString:@".aif"];
}
Теперь он может загрузить последний записанный файл через NSUserdefaults, загрузив его:
//Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
temporaryRecFile = [prefs URLForKey:@"Test1"];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
в (IBAction) PlayBack. Временная переменная - это переменная NSURL в моем классе ViewController.
объявлен как следующий ViewController.h:
@interface SoundRecViewController : UIViewController <AVAudioSessionDelegate,AVAudioRecorderDelegate, AVAudioPlayerDelegate>
{
......
......
NSURL *temporaryRecFile;
AVAudioRecorder *recorder;
AVAudioPlayer *player;
}
......
......
@end