【问题标题】:Record & play audio in AAC format iOS 5 +以 AAC 格式录制和播放音频 iOS 5 +
【发布时间】:2012-08-17 07:45:24
【问题描述】:

我想在 iOS 中录制声音并播放。我也想将录制的文件发送到服务器。我有一个转折点,即录制的文件也必须在 ANDROID 设备上播放。所以我尝试使用 MP3 。但是 AVAudioRecorder 不允许 MP3 格式进行录制。所以我使用了AAC。但它不起作用。这是我的代码

    -(void)initializeAudioRecorder {

    self.btnPlayRecording.enabled = NO;
    self.btnStopRecording.enabled = NO;

    // Get sound file URL in which recording is saved
    NSURL *soundFileURL = [NSURL fileURLWithPath:[self soundFilePath]];

    // Set settings for audio recording
    NSDictionary *audioRecordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInt:AVAudioQualityMin],AVEncoderAudioQualityKey,
        [NSNumber numberWithInt:16],AVEncoderBitRateKey,
        [NSNumber numberWithInt:2], AVNumberOfChannelsKey,
        [NSNumber numberWithFloat:44100.0],AVSampleRateKey,
        [NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey, nil];

    NSError *error = nil;
    self.audioRecorder = [[AVAudioRecorder alloc]
                     initWithURL:soundFileURL
                     settings:audioRecordSettings
                     error:&error];

    if (error)
    {
        NSLog(@"error: %@", [error localizedDescription]);
    } 
    else {
        if (![self.audioRecorder prepareToRecord]) {
            NSLog(@"Failed to prepare recording");
        }
    }
}

    #pragma mark - Get Sound File Path

-(NSString*)soundFilePath {

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDirPath = [dirPaths objectAtIndex:0];
    NSString *soundFilePath = [docsDirPath stringByAppendingPathComponent:@"testSound.aac"];
    return soundFilePath;
}


#pragma mark - IBAction Methods

- (IBAction)btnStartRecordingTapped:(id)sender {

    if (!self.audioRecorder.recording) {
        self.btnPlayRecording.enabled = NO;
        self.btnStopRecording.enabled = YES;
        [self.audioRecorder record];
    }
}

- (IBAction)btnStopRecordingTapped:(id)sender {

    self.btnStopRecording.enabled = NO;
    self.btnPlayRecording.enabled = YES;
    self.btnStartRecording.enabled = YES;
}

- (IBAction)btnPlayRecordingTapped:(id)sender {

    if (!audioRecorder.recording) {
        self.btnStopRecording.enabled = YES;
        self.btnStartRecording.enabled = NO;
        NSError *error = nil;

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

        if (error) {
            NSLog(@"Error occured while playing recorded audio.\nError:- %@",[error localizedDescription]);
        }
        else {
            [self.audioPlayer play];
        }

    }
}

#pragma mark - AVAudioPlayer Delegate MEthods

/* audioPlayerDidFinishPlaying:successfully: is called when a sound has finished playing. This method is NOT called if the player is stopped due to an interruption. */
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSLog(@"In %s",__PRETTY_FUNCTION__);
    self.btnStartRecording.enabled = YES;
    self.btnStopRecording.enabled = NO;
}

/* if an error occurs while decoding it will be reported to the delegate. */
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
    NSLog(@"In %s",__PRETTY_FUNCTION__);
    NSLog(@"audioPlayerDecodeError:- %@",[error localizedDescription]);
}

#pragma mark - AVAudioRecorder Delegate MEthods

/* audioRecorderDidFinishRecording:successfully: is called when a recording has been finished or stopped. This method is NOT called if the recorder is stopped due to an interruption. */
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    NSLog(@"In %s",__PRETTY_FUNCTION__);
}

/* if an error occurs while encoding it will be reported to the delegate. */
- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error
{
    NSLog(@"In %s",__PRETTY_FUNCTION__);
    NSLog(@"audioRecorderEncodeError:- %@",[error localizedDescription]);
}

但上面的代码没有录制音频。文件在 DOCS 目录中创建。但是当我尝试播放它时,它不起作用。我什么都听不见。

我的代码有什么问题? 还有任何用于录制和播放音频格式的库,可以在 iOS + Android 上播放吗?谢谢

【问题讨论】:

  • 嗨@IOSAppDev 我需要录制音频,它应该同时播放 ios 和 android 。你有什么想法吗
  • 嗨朋友,我正在尝试使用以下Code 来录制来自 Android 的语音并在 iOS 中播放,但无法正常工作。你能告诉我我错过了什么吗?

标签: ios avaudioplayer avaudiorecorder aac


【解决方案1】:

这对我有用:

  1. 确保设备音量足够大:

    MPMusicPlayerController * musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
    if (musicPlayer.volume < 1.0) {
          musicPlayer.volume = 1; // device volume will be changed to maximum value
    }
    musicPlayer = nil;
    
  2. 使用 AVAudioSession:

    AVAudioPlayer * meinPlayer = [[AVAudioPlayer alloc]
                      initWithContentsOfURL:soundFileURL
                      error:&error];
    meinPlayer.delegate = self;
    
    [meinPlayer prepareToPlay]
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    [session setActive:YES error:nil];
    [meinPlayer play];
    

【讨论】:

  • 嗨朋友,我正在尝试使用以下Code 来录制来自 Android 的语音并在 iOS 中播放,但无法正常工作。你能告诉我我错过了什么吗?
【解决方案2】:

在实际播放声音之前尝试调用 AVAudioPlayer 的 prepareToPlay 方法。同时检查您的设备音量。

【讨论】:

    【解决方案3】:
    // check audio permission
        AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in
            print(" check result: \(granted)")
            do{
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
                try AVAudioSession.sharedInstance().setActive(true)
            }catch{
            }
    
        })
    

    【讨论】:

    • 您必须将这些代码添加到您的 DidLoad 函数中
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2017-10-17
    • 2023-04-03
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多