Właściwie nie ma żadnych przykładów. Oto mój działający kod. Nagrywanie jest uruchamiane przez użytkownika naciskając przycisk na pasku nawigacyjnym. W nagraniu zastosowano jakość CD (44100 próbek), stereo (2 kanały) linear pcm. Uwaga: jeśli chcesz użyć innego formatu, zwłaszcza zakodowanego, upewnij się, że w pełni rozumiesz, jak ustawić ustawienia AVAudioRecorder (przeczytaj uważnie dokumentację typów audio), w przeciwnym razie nigdy nie będziesz w stanie go poprawnie zainicjować. Jeszcze jedna rzecz. W kodzie nie pokazuję, jak obchodzić się z danymi pomiarowymi, ale możesz to łatwo rozgryźć. Na koniec zwróć uwagę, że metoda AVAudioRecorder deleteRecording od tego momentu powoduje awarię aplikacji. Dlatego właśnie usuwam nagrany plik za pomocą Menedżera plików. Po zakończeniu nagrywania zapisuję nagrany dźwięk jako NSData w aktualnie edytowanym obiekcie za pomocą 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
}
Chociaż jest to pytanie, na które udzielono odpowiedzi (i trochę stare), zdecydowałem się opublikować mój pełny działający kod dla innych, którym trudno było znaleźć dobry działający (po wyjęciu z pudełka) przykład odtwarzania i nagrywania - w tym zakodowany, pcm, odtwarzanie przez głośnik napisz do pliku tutaj jest:
AudioPlayerViewController.h:
AudioPlayerViewController.m:
Mam nadzieję, że to pomoże niektórym z was.
źródło
Wgrałem przykładowy projekt. Możesz spojrzeć.
Dyktafon
źródło
To naprawdę pomocne. Jedynym problemem, jaki miałem, był rozmiar pliku dźwiękowego utworzonego po nagraniu. Musiałem zmniejszyć rozmiar pliku, więc dokonałem pewnych zmian w ustawieniach.
Rozmiar pliku został zmniejszony z 360 kb do zaledwie 25 kb (2 sekundy nagrania).
źródło
Próbowałem zmusić ten kod do działania przez ostatnie 2 godziny i chociaż nie pokazał żadnego błędu na symulatorze, był jeden na urządzeniu.
Okazuje się, że przynajmniej w moim przypadku błąd pochodził z używanego katalogu (paczki):
Nie było możliwości zapisu lub coś w tym stylu ... Nie było żadnego błędu poza tym, że nie udało się przygotowaćToRecord ...
Dlatego zastąpiłem go:
Teraz działa jak urok.
Mam nadzieję, że to pomoże innym.
źródło
Wielkie dzięki @Massimo Cafaro i Shaybc udało mi się wykonać poniższe zadania
w iOS 8:
1. Dodaj plik „AVFoundation.framework” do swojego projektu
w pliku h
2. Dodaj poniżej instrukcję importu „AVFoundation / AVFoundation.h”.
3. Zdefiniuj „AVAudioRecorderDelegate”
4. Stwórz układ z przyciskami Record, Play i ich metodami działania
5. Zdefiniuj rejestrator i odtwarzacz itp.
Oto pełny przykładowy kod, który może ci pomóc.
Następnie wykonaj pracę w
źródło
źródło
W poniższym linku można znaleźć przydatne informacje na temat nagrywania za pomocą AVAudioRecording. W tym łączu w pierwszej części „Użycie dźwięku” znajduje się kotwica o nazwie „Nagrywanie z klasą AVAudioRecorder”. to prowadzi do przykładu.
AudioVideo Conceptual MultimediaPG
źródło
Ok, więc odpowiedź, którą otrzymałem, pomogła mi we właściwym kierunku i jestem bardzo wdzięczny. Pomogło mi to dowiedzieć się, jak właściwie nagrywać na iPhonie, ale pomyślałem, że dołączę też pomocny kod, który otrzymałem z biblioteki referencyjnej iPhone'a:
AudioandVideoTechnologies
Użyłem tego kodu i dość łatwo dodałem go do przykładu avTouch. Dzięki powyższemu przykładowi kodu i przykładowi z biblioteki referencyjnej udało mi się to całkiem dobrze.
źródło
dla formatu wav poniżej ustawień audio
ref: http://objective-audio.jp/2010/09/avassetreaderavassetwriter.html
źródło
let recordSettings:[String:AnyObject] = [ AVFormatIDKey:Int(kAudioFormatLinearPCM), AVLinearPCMIsFloatKey:false, AVLinearPCMIsBigEndianKey:0, AVLinearPCMIsNonInterleaved:false, AVSampleRateKey:44100.0, AVNumberOfChannelsKey:2, AVEncoderBitRateKey:12800, AVLinearPCMBitDepthKey:16, AVEncoderAudioQualityKey:AVAudioQuality.Max.rawValue]
POCZĄTEK
ZATRZYMAĆ
źródło
źródło
Zgodnie z powyższymi odpowiedziami dokonałem pewnych zmian i otrzymałem poprawny wynik.
Krok 1: W sekcji „inf.plist” dodaj uprawnienia do korzystania z mikrofonu ==>
Krok 2:
Zapisz plik audio nagrania w lokalnym katalogu dokumentów
Odtwórz / Zatrzymaj nagrywanie
Oto kod źródłowy. Spójrz na to od razu i użyj go.
ViewController.h
ViewController.m
źródło
-[NSUserDefaults synchronize]
. Z dokumentacji firmy Apple wynika, że „ta metoda jest niepotrzebna i nie należy jej używać”.