10

我正在开发也支持 iOS 的 android 应用程序。我想录制音频并在 Android 和 iOS 设备中播放。我正在使用以下设置在 android 中录制音频

MediaRecorder audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
audioRecorder.setAudioSamplingRate(44100);
audioRecorder.setAudioChannels(1);
audioRecorder.setAudioEncodingBitRate(12800);
audioRecorder.setOutputFile(<recordedSoundFilePath>);
audioRecorder.prepare();
audioRecorder.start();

在iOS端,设置如下

//audioRecorder is object of  AVAudioRecorder 

NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10];
    NSNumber *formatObject;
    formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC ];

    [recordSettings setObject:formatObject forKey: AVFormatIDKey];
    [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
    [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey];

    NSURL *soundFileURL = [NSURL fileURLWithPath:[self soundFilePath]];

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

    if ([audioRecorder prepareToRecord] == YES){
        [audioRecorder record];
    }else {
        int errorCode = CFSwapInt32HostToBig ([error code]);
        NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode);

    }

我可以录制音频并且它在 android 设备中正确播放。现在的问题是我可以在 Android 设备上播放 iOS 录制的音频,但iOS 设备无法播放 Android 设备上录制的音频。它返回OSStatus error 1937337955。我搜索了这个错误,但我找不到任何东西。

谁能告诉我我的代码出了什么问题?

任何形式的帮助都将受到高度赞赏。提前致谢。

4

4 回答 4

1

试试这个:

audioRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
于 2013-02-01T12:09:31.223 回答
1

我遇到了同样的问题,即从三星设备录制的音频无法在所有 IOS 设备上运行,甚至在 safari 浏览器上也无法运行。但它们在所有安卓设备上都能正常工作。我已通过在 AudioRecordingUtil 类中添加以下行来解决此问题:

recorder?.let{
  it.setAudioSource(MediaRecorder.AudioSource.MIC)
  it.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS)
  it.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
}

希望这可以帮助!

于 2020-03-31T14:46:36.107 回答
0

这是编解码器的问题,iOS 录制的格式无法通过 android 媒体播放器解码,为了使其正常工作,只需将 IOS 端的音频文件解码为 android 支持的格式,如 mp3 或 mp4 或 3Gp 等。

于 2013-03-26T20:26:30.663 回答
0

我也遇到了 MediaRecorder 的问题。在录音时,Mime 类型是不同的,例如

Mac chrome - Mime Type:audio/webm;codecs=opus
Mac Safari - Mime Type:audio/mp4
Windows/Android - Mime Type:audio/webm;codecs=opus
Iphone Chrome - Mime Type:audio/mp4

我将文件保存为 M4a,但音频未在 IOS 中运行。经过一些分析和测试。我决定在服务器上传后转换文件并使用 ffmpeg,它就像一个魅力。

    <!-- https://mvnrepository.com/artifact/org.bytedeco/ffmpeg-platform -->
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>ffmpeg-platform</artifactId>
        <version>4.3.2-1.5.5</version>
    </dependency>


 /**
 * Convert the file into MP4 using H264 Codac in order to make it work in IOS Mobile Device
 * @param file
 * @param outputFile
 */
private void convertToM4A(File file, File outputFile) {
    try {
        String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
        ProcessBuilder pb = new ProcessBuilder(ffmpeg, "-i", file.getPath(), "-vcodec", "h264", outputFile.getPath());
        pb.inheritIO().start().waitFor();
    }catch (Exception e ){
        e.printStackTrace();
    }
}
于 2021-05-18T21:33:48.290 回答