Записывайте аудио и сохраняйте постоянно в 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, перезаписывая существующие файлы с тем же именем.

  1. После записи и сохранения аудио в файл и остановки приложения я смог найти файл в Finder. (/Users/xxxxx/ Библиотека / Поддержка приложений /iPhone Simulator/6.0/ Приложения /0F107E80-27E3-4F7C-AB07-9465B575EDAB/Documents/sound1.caf)
  2. Когда я перезапускаю приложение, код установки для рекордера (из viewLoad) просто перезаписывает мой старый файл с именем:

    sound1.caf

  3. с новым. То же имя, но без содержания.

  4. Воспроизведение будет просто воспроизвести пустой новый файл. -> Нет звука, очевидно.


Итак, вот что я сделал:

Я использовал 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
Другие вопросы по тегам