2

我想在 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 上播放吗?谢谢

4

3 回答 3

2

这对我有用:

  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];
    
于 2013-01-01T10:51:23.793 回答
0

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

于 2012-10-07T11:45:09.157 回答
0
// 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{
        }

    })
于 2015-11-27T08:06:47.110 回答