Запись аудио и сохранение навсегда в iOS

Я сделал 2 приложения для iPhone, которые могут записывать аудио и сохранять его в файл и воспроизводить его снова.

Один из них использует AVAudiorecorder и AVAudioplayer. Второй – пример Apple SpeakHere с аудио очереди.

Оба работают на Simulater, а также на устройстве.

НО, когда я перезапускаю приложение, записанный файл не найден !!! Я пробовал все возможные предложения, найденные в stackoverflow, но он все еще не работает!

Это то, что я использую для сохранения файла:

NSArray *dirPaths; NSString *docsDir; dirPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound1.caf"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

Хорошо, я наконец решил. Проблема заключалась в том, что я настраивал AVAudioRecorder и записывал путь в viewLoad моего ViewController.m, перезаписывая существующие файлы с тем же именем.

  1. После записи и сохранения звука в файл и остановки приложения я могу найти файл в Finder. (/ Пользователи / 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. temporRecFile – это переменная NSURL в моем классе ViewController.

объявленный как следующий ViewController.h:

 @interface SoundRecViewController : UIViewController <AVAudioSessionDelegate,AVAudioRecorderDelegate, AVAudioPlayerDelegate> { ...... ...... NSURL *temporaryRecFile; AVAudioRecorder *recorder; AVAudioPlayer *player; } ...... ...... @end 
  • Swift 2: аудиофайлы AVFoundation в реальном времени
  • Я не могу обновить запись в Parse; Ошибка: "объект не найден для обновления (Код: 101, Версия: 1.2.16)"
  • iOS записывает файл midi
  • Ошибка домена = AVFoundationErrorDomain Код = -11814 «Невозможно записать»
  • Опубликовать изображение на Instagram с помощью Swift (необходимо перевести код)
  • requestRecordPermission ничего не делает
  • Как захватить видео в iPhone?
  • Interesting Posts

    Перетащите элементы из вида коллекции и выберите другой вид IOS

    Процедура повторного подключения в приложении IOS BLE

    Программно изменить rootViewController для storyBoard

    UIAccessibilityNotificationQuestion

    Текущая очередь воспроизведения для MPMusicPlayerController?

    Как отправить приложение iOS в App Store (iTunes Connect) с помощью Xcode

    Pods-Alamofire: Swift не поддерживается для статических библиотек

    Objective-C, отмените очередь отправки, используя событие пользовательского интерфейса

    При покупке приложения с размещенным контентом не работает, когда

    Можем ли мы установить различное расписание потока в разных разделах в UICollectionView?

    ios 9 и NSAppTransportSecurity

    «Быстрая версия языка» (SWIFT_VERSION) требуется правильно настроить для целей, которые используют Swift

    Обновить данные NSFetchedResultsController?

    Как определить, поддерживает ли версия iOS автоматическое обновление покупок?

    Волонтерский интерфейс API Цель C

    Давайте будем гением компьютера.