Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-录制音频并播放_Ios_Objective C_Avaudioplayer_Audio Recording - Fatal编程技术网

iOS-录制音频并播放

iOS-录制音频并播放,ios,objective-c,avaudioplayer,audio-recording,Ios,Objective C,Avaudioplayer,Audio Recording,我正在尝试编写一个应用程序,允许我录制消息,然后让用户播放他们录制的内容,但由于某些原因,此代码无法工作。当调用playAction方法时,我听到的只是死气沉沉的声音。有什么想法吗 - (void) playAction { NSLog(@"PlaY action"); NSError *error; AVAudioPlayer *player = [[AVAudioPlayer alloc] init

我正在尝试编写一个应用程序,允许我录制消息,然后让用户播放他们录制的内容,但由于某些原因,此代码无法工作。当调用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]...
致:


希望这能有所帮助。

Wierd,但这起作用了。不太清楚为什么会有不同,但谢谢!因为在第一个示例中,AVAudioPlayer的生命周期在0.0001秒后死亡,此时执行在[player play]之后命中第一个“}”。在@Unheilig示例中,生命周期与实现这些方法的类实例的生命周期密切相关。
@property(nonatomic, strong) AVAudioPlayer *player;

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