本文介绍了AVAudioRecorder在中断后仅记录音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我使用AVAudioRecorder和AVAudioPlayer录制和播放音频的应用程序中,我遇到了来电的情况。虽然录音正在进行中并且如果来电,但是通话后录制的音频只是录音。我希望在通话结束后录制的录音是电话前录音的延续。

In my application for recording and playing audio using AVAudioRecorder and AVAudioPlayer I came across a scenario in the case of incoming phone call.While the recording is in progress and if the phone call comes,the audio recorded after the phone call is only recorded.I want the recording recorded after the phone call to be the continuation of the audio recorded before the phone call.

我使用AVAudioRecorderDelegate跟踪录音机中发生的中断方法

I track the interruption occuring in audio recorder using the AVAudioRecorderDelegate methods


  • (void)audioRecorderBeginInterruption:(AVAudioRecorder *)avRecorder

  • ( void)audioRecorderEndInterruption:(AVAudioRecorder *)avRecorder。

在我的EndInterruption方法中,我激活audioSession。

In my EndInterruption method I activates the audioSession.

这是我使用的录音代码

- (void)startRecordingProcess
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];
    if(err)
    {
        DEBUG_LOG(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }
    [audioSession setActive:YES error:&err];
    err = nil;
    if(err)
    {
        DEBUG_LOG(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        return;
    }
    // Record settings for recording the audio
    recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:
                     [NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
                     [NSNumber numberWithInt:44100],AVSampleRateKey,
                     [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
                     [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                     [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                     [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                     nil];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:recorderFilePath];
    if (fileExists)
    {
        BOOL appendingFileExists =
            [[NSFileManager defaultManager] fileExistsAtPath:appendingFilePath];
        if (appendingFileExists)
        {
            [[NSFileManager defaultManager]removeItemAtPath:appendingFilePath error:nil];
        }
        if (appendingFilePath)
        {
            [appendingFilePath release];
            appendingFilePath = nil;
        }
        appendingFilePath = [[NSString alloc]initWithFormat:@"%@/AppendedAudio.m4a", DOCUMENTS_FOLDER];
        fileUrl = [NSURL fileURLWithPath:appendingFilePath];
    }
    else
    {
        isFirstTime = YES;
        if (recorderFilePath)
        {
            DEBUG_LOG(@"Testing 2");
            [recorderFilePath release];
            recorderFilePath = nil;
        }
        DEBUG_LOG(@"Testing 3");
        recorderFilePath = [[NSString alloc]initWithFormat:@"%@/RecordedAudio.m4a", DOCUMENTS_FOLDER];
        fileUrl = [NSURL fileURLWithPath:recorderFilePath];
    }
    err = nil;
    recorder = [[recorder initWithURL:fileUrl settings:recordSetting error:&err]retain];
    if(!recorder)
    {
        DEBUG_LOG(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
        [[AlertFunctions sharedInstance] showMessageWithTitle:kAppName
                                                      message:[err localizedDescription]
                                                     delegate:nil
                                            cancelButtonTitle:@"Ok"];
        return;
    }
    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    [recorder record];

}

在搜索此问题的解决方案时,我遇到了另一个链接
和提到了同样的问题。
我尝试了这些链接中提供但未成功的建议。
我希望它能与AVAudioRecorder本身一起使用。
有什么方法可以找到解决这个问题的方法吗?
所有宝贵的建议都表示赞赏。

While searching for a solution to this issue I came across another link how to resume recording after interruption occured in iphone? and http://www.iphonedevsdk.com/forum/iphone-sdk-development/31268-avaudiorecorderdelegate-interruption.html which speaks of the same issue.I tried the suggestions that were given in those links but were not successful.I hope to make it work with AVAudioRecorder itself.Is there any way I could find a solution to this issue?All valuable suggestions are appreciated.

推荐答案

经过多次研究后,Apple通知我这是一个当前的问题API。所以我设法通过在中断之后保存先前的音频文件并将其与恢复的音频文件连接来找到该问题的解决方法。希望它可以帮助那些可能面临同样问题的人。

After several research I was notified by Apple that it's an issue with the current API. So I managed to find a workaround for the issue by saving the previous audio file just after interruption and joining it with the resumed audio file. Hope it helps someone out there who may face the same issue.

这篇关于AVAudioRecorder在中断后仅记录音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-02 10:22