5

ビューが読み込まれるときに、次の方法で AVAudioRecorder インスタンスを設定します。

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[audioSession setActive:YES error:nil];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

NSString *tempDir = NSTemporaryDirectory();
NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"];

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"%@", soundFileURL);

NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey,
                                [NSNumber numberWithInt:16], AVEncoderBitRateKey,
                                [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                [NSNumber numberWithFloat:8000.0], AVSampleRateKey,
                                [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
                                nil];

NSError *error = nil;

self.recorder = [[AVAudioRecorder alloc]
                 initWithURL:soundFileURL
                 settings:recordSettings
                 error:&error];
self.recorder.delegate = self;

if (error) {
    NSLog(@"error: %@", [error localizedDescription]);
} else {
    [self.recorder prepareToRecord];
}

次に、ユーザーが記録ボタンを押すと、次のようになります。

- (IBAction)record:(id)sender {
    if (!self.isRecording) {
        self.isRecording = YES;
        [self.recorder record];
        self.recordButton.enabled = NO;
    }
}

次に、録音/再生を停止します。

- (IBAction)stop:(id)sender {
    if (self.isRecording) {
        [self.recorder stop];
        self.recordButton.enabled = YES;
        self.isRecording = NO;
    }

    if (self.isPlaying) {
        [self.player stop];
        self.isPlaying = NO;
        self.playButton.enabled = YES;
    }
}

その後、録音したものを再生できるようにしたいので、次のようにします。

- (IBAction)play:(id)sender {
    NSError *error = nil;
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];
    self.player.delegate = self;

    if (error) {
        NSLog(@"%@", error.localizedDescription);
    } else {
        self.isPlaying = YES;
        [self.player play];
        self.playButton.enabled = NO;
    }
}

しかし、ファイルを再生すると、OSStatus エラー -43 file not found が表示されます。

これはすべてデバイスで実行されており、シミュレーターでは、レコーダーまたはプレーヤーをインスタンス化しようとするとエラーが発生します。これはシミュレーターの問題であることがわかりました。

編集 1: OSStatus エラー -43 の部分を解決しました。エンコード形式と関係があります。形式をコメントアウトし、ファイルを適切に記録および再生しましたが、圧縮形式で記録する必要があります。これの設定わかる人いますか?

編集 2:圧縮された AAC オーディオで機能する設定を見つけることができました。2 分間のオーディオ ファイルは 256 KB になります。現在の状態を反映するようにコードを更新しました。あなたの助けに答えてくれたすべての人に感謝します。

4

4 に答える 4

8

他の誰も答えていないので、私はこれを激しく突き刺すつもりです(編集:今あります)(私はiOSのオーディオの経験があまりありません)しかし...

変更してみる

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
于 2012-04-23T20:31:21.400 に答える
2

AVEncoderBitRateKeyフォーマットエンコーディングでは機能しませんAAC。このコードを試してください。

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"%@", soundFileURL);

 NSDictionary *recordSettings = [NSDictionary 
                                        dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithInt:kAudioFormatMPEG4AAC],
                                        AVFormatIDKey,
                                        [NSNumber numberWithInt: AVAudioQualityMax],
                                        AVEncoderAudioQualityKey,
                                        [NSNumber numberWithInt: 1], 
                                        AVNumberOfChannelsKey,
                                        [NSNumber numberWithFloat:44100.0], 
                                        AVSampleRateKey,
                                        nil];
NSError *error = nil;

self.recorder = [[AVAudioRecorder alloc]
                 initWithURL:soundFileURL
                 settings:recordSettings
                 error:&error];
self.recorder.delegate = self;

if (error) {
    NSLog(@"error: %@", [error localizedDescription]);
    NSLog(@"error: %@", [error description]);
} else {
    [self.recorder prepareToRecord];
} 

編集1:

OSStatus エラー -43 file not foundは、シミュレーターの問題ではありません。これはエラー ログで、あなたのrecording settings are not correctと 必要なを示していますencoding format is not supported for the settings you have selected

このエラーが発生すると、指定した形式でファイルが作成されます。しかし、そうなるでしょうnot initialize your audio recorder to start recording。疑問がある場合は、最初の質問で使用したのと同じ設定を選択して記録し、それを再生してみてください。サポートされていない設定のため、録音と再生ができません。

したがって、 のcompressed encoding format場合、上記のコードで指定した設定を使用できます。.aacこの設定の形式を設定できます。フォーマットがかかり164KB per 10 seconds to record in aacます。残りの形式については、試して把握する必要があります。

于 2012-04-29T15:09:49.873 に答える
0

AVAudioSession カテゴリを再生モードに戻す必要がある場合があります。

NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&_error];

if (_error) {
    // handle error here
}

これにより、ミュート スイッチがオンになっているとオーディオが再生されないという問題も回避できます。

于 2012-04-23T20:33:23.847 に答える
0

これを試してください:

クラスをNSURL *soundFileURLグローバルにして、クラスのどこからでもアクセスできるようにし、現在と同じ方法で設定できるようにしますsoundFileURL = [NSURL fileURLWithPath:soundFilePath];( NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];.

次に、これを変更します

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];

これに

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];
于 2012-04-23T22:04:31.543 に答える