iOS - 录制音频和播放

标签 ios objective-c avaudioplayer audio-recording

我正在尝试编写一个允许我录制消息的应用程序,然后让用户播放他们录制的内容,但出于某种原因,此代码无法正常工作。当调用 playAction 方法时,除了死气沉沉的空气外,我什么也听不到。有任何想法吗?

- (void) playAction
{
    NSLog(@"PlaY action");

    NSError *error;
    AVAudioPlayer *player = [[AVAudioPlayer alloc]
                                  initWithContentsOfURL:[NSURL fileURLWithPath:recorderFilePath] error:&error];
//    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:self.audioData error:&error];
    [player prepareToPlay];
    [player play];

}
- (void) startRecording
{
    [self.timer fire];
    self.recordButton.userInteractionEnabled = NO;
    self.stopButton.hidden = NO;
    self.playButton.hidden = YES;

    self.counterLabel.hidden = NO;
    self.viewTitle.hidden = YES;
    self.shortBlurb.hidden = YES;

    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;
    }

    NSMutableDictionary *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];

    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];
        return;
    }

    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;

    BOOL audioHWAvailable = audioSession.inputAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show];
        return;
    }

    // start recording
    [recorder recordForDuration:(NSTimeInterval) 7];
}

- (void) stopRecording{

    self.counterLabel.hidden = YES;
    self.recordButton.userInteractionEnabled = YES;

    self.viewTitle.hidden = NO;
    self.shortBlurb.hidden = NO;

    self.recordButton.hidden = NO;
    self.playButton.hidden = NO;
    self.stopButton.hidden = YES;

    [recorder stop];

    NSURL *url = [NSURL fileURLWithPath: recorderFilePath];
    NSError *err = nil;
    self.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]);
}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{

    NSLog (@"audioRecorderDidFinishRecording:successfully:");
    // your actions here

}

最佳答案

我觉得不错,除了:

尝试改变这个:

AVAudioPlayer *player = [[AVAudioPlayer alloc]...

到:

@property(nonatomic, strong) AVAudioPlayer *player;

self.player = [[AVAudioPlayer alloc].....

希望这对您有所帮助。

关于iOS - 录制音频和播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290341/

相关文章:

ios - 在 iOS 的 NSArray 中获取匹配对象索引的最佳方法?

objective-c - Audio Session 更改时 MPVolumeView slider 消失

ios - 使用 AVAudioPlayer 使 UISlider 随进度更新

ios - 如何在单击新闻歌曲时停止 avaudioplayer 播放上一首歌曲?

ios - ITSAppUsesNonExemptEncryption 不再起作用

ios - 这个应用程序的开发者没有为 iOS 中的 Facebook 登录正确设置这个应用程序?

ios - Swift 弱引用混淆

ios - 设置 CAShapeLayer 的线帽

objective-c - 如何在没有导航栏的 View Controller 内使用导航推送 UIViewController

iphone - iOS 4.3 网络连接丢失