1

サー、私のコードのエラーはどう思いますか..オーディオを録音できないからです。私のプロジェクトで私を助けてくれませんか?簡単なレコーディングプロジェクトを作りたいです。3つのボタン(PLAY、STOP、RECORD)で...ちなみに私はnibファイルを使用しませんでした。Objective-Cの初心者の場合、私のアプローチは純粋にプログラムによるものです。

これはviewDidLoad()の私のコードです

-(void)viewDidLoad
{
    [super viewDidLoad];{
        playButton.enabled = NO;
    stopButton.enabled = NO;

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

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSDictionary *recordSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];

    NSError *error = nil;

    audioRecorder = [[AVAudioRecorder alloc]initWithURL:soundFileURL settings:recordSettings error:&error];

    if (error)
    {
        NSLog(@"error: %@", [error localizedDescription]);

    }
    else 
    {
        [audioRecorder prepareToRecord];
    }

}


-(void) recordButton:(UIButton *)sender
{
        if (!audioRecorder.recording)
        {

            playButton.enabled = NO;
            stopButton.enabled = YES;
            [audioRecorder record];
             NSLog(@"Record");
        }
}


-(void)stop:(UIButton *)sender
{
        stopButton.enabled = NO;
        playButton.enabled = YES;
        recordButton.enabled = YES;

        if (audioRecorder.recording)
        {
            [audioRecorder stop];
            NSLog(@"Stop");
        } 
        else if (audioPlayer.playing) 
        {
            [audioPlayer stop];
        }
}

-(void) playAudio:(UIButton *)sender
{
    NSError *error;
        if (!audioRecorder.recording)
        {
            stopButton.enabled = YES;
            recordButton.enabled = NO;
             NSLog(@"Play");
            if (audioPlayer)
            {


            audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioRecorder.url error:&error];

            audioPlayer.delegate = self;
            }
            if (error)

            { NSLog(@"Error: %@", 
                      [error localizedDescription]);
            }
            else
                [audioPlayer play];
        }
}
4

2 に答える 2

0

Apple は、Audio File Services を使用して(Core Audio Format) オーディオ ファイルSpeakHereの作成、録音、読み取りを行う際に非常に役立つというサンプル アプリケーションを提供しています。CAF

Apple の開発者向けサイト (こちら) で見つけることができます。

お役に立てれば。

于 2012-07-16T13:08:07.630 に答える
0

まず、コードを viewDidLoad から viewDidAppear または関数呼び出しに移動します。次に、AVAudioSession について読んでください。簡単に言えば、それぞれ録音または再生するときに、カテゴリを AVAudioSessionCategoryRecord または AVAudioSessionCategoryPlay に変更します。

- (void)beginRecording {

  AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  NSError *err = nil;
  [audioSession setCategory:AVAudioSessionCategoryRecord error:&err];
  if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
  }
  err = nil;
  [audioSession setActive:YES error:&err];
  if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
  }
  if (audioSession.inputIsAvailable) {
    if ([audioRecorder prepareToRecord]) {
      [audioRecorder record];
    }
    else {
      UIAlertView *alert =
      [[UIAlertView alloc] initWithTitle:@"Error!"
                                 message:@"Could not begin recording"
                                delegate:nil
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil];
      [alert show];
      [alert release];
    }
  }
}

- (void)stopRecording {
  [audioRecorder stop];
}

これらは、記録を開始するために必要な最小限のパラメーターです (少なくとも、私にとってはうまくいきましたが、AppleLoseless は非常に重要であるため、品質を任意の値に設定できますが、最小品質は最も厄介なものであることに注意してください。知られている銀河):

  NSMutableDictionary *settings = [[[NSMutableDictionary alloc] init] autorelease];
  [settings setValue:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey:AVFormatIDKey];
  [settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
  [settings setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
  [settings setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
  [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
  [settings setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSError *err = nil;
    self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:url
                                                        settings:settings
                                                           error:&err];
    if(err){
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle:@"Warning"
                                   message:[err localizedDescription]
                                  delegate:nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [alert show];
        [alert release];
      }

私はメモリ管理を完全に無視していることに注意してください。この投稿はメモリ管理ガイドではありません。

于 2012-07-16T13:26:42.240 に答える