Nagrywaj dźwięk i zapisuj na stałe w systemie iOS
Zrobiłem 2 aplikacje na iPhone ' a, które mogą nagrywać dźwięk i zapisywać go do pliku i odtwarzać ponownie.
Jeden z nich używa Avaudiorecordera i AVAudioplayer. Drugi to przykład Apple ' a SpeakHere z kolejkami Audio.Oba działają zarówno na Simulaterze, jak i na urządzeniu.
Ale po ponownym uruchomieniu żadnej aplikacji nagrany plik nie został znaleziony!!! Wypróbowałem wszystkie możliwe sugestie znalezione na stackoverflow, ale nadal nie działa!
To jest to, czego używam, aby zapisać plik:
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 answers
OK, w końcu to rozwiązałem. Problem polegał na tym, że ustawiałem AVAudioRecorder i zapisywałem ścieżkę w viewLoad mojego kontrolera Viewcontrollera.m nadpisywanie istniejących plików o tej samej nazwie.
- po nagraniu i zapisaniu dźwięku do pliku i zatrzymaniu aplikacji, mogłem znaleźć plik w Finderze. (/Users/xxxxx/Library/Application Support/iPhone Simulator/6.0/Applications/0f107e80-27E3-4f7c-AB07-9465b575edab/Documents / sound1.caf)
-
Po ponownym uruchomieniu aplikacji kod konfiguracji rejestratora (z viewLoad) nadpisałby mój stary plik o nazwie:
Sound1.caf
Z nowym. Ta sama nazwa, ale bez treści.
Odtwarzanie odtwarzałoby tylko pusty nowy plik. -- >Brak dźwięku oczywiście.
Oto co zrobiłem:
Użyłem NSUserdefaults, aby zapisać ścieżkę nagranej nazwy pliku, która zostanie pobrana później w mojej metodzie odtwarzania.
Oczyszczony widok w ViewController.m:
- (void)viewDidLoad
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[audioSession setActive:YES error:nil];
[recorder setDelegate:self];
[super viewDidLoad];
}
Edytowano rekord w 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];
}
Edytowano odtwarzanie w kontrolerze 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];
}
I dodano nową metodę dateString do 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"];
}
Teraz może załadować ostatnio zarejestrowany plik poprzez NSUserDefaults ładując go za pomocą:
//Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
temporaryRecFile = [prefs URLForKey:@"Test1"];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
W odtwarzaniu (IBAction). temporaryRecFile jest zmienną nsurl w mojej klasie ViewController.
Zadeklarowany jako następujący ViewController.h:
@interface SoundRecViewController : UIViewController <AVAudioSessionDelegate,AVAudioRecorderDelegate, AVAudioPlayerDelegate>
{
......
......
NSURL *temporaryRecFile;
AVAudioRecorder *recorder;
AVAudioPlayer *player;
}
......
......
@end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 14:17:55