【问题标题】:Can not play recorded audio file from android in iOS 5+无法在 iOS 5+ 中从 android 播放录制的音频文件
【发布时间】:2013-02-01 11:53:12
【问题描述】:

我正在开发也支持 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 设备上播放 iOS 录制的音频,但是 iOS 设备无法播放 Android 设备上录制的音频。它返回OSStatus error 1937337955。我搜索了这个错误,但我找不到任何东西。

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

我们非常感谢任何形式的帮助。提前致谢。

【问题讨论】:

  • @PrvN:解决了吗?我也有同样的问题。

标签: android ios5 avaudiorecorder aac android-mediarecorder


【解决方案1】:

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

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

希望这能有所帮助!

【讨论】:

    【解决方案2】:

    试试这个:

    audioRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    

    【讨论】:

    • 感谢您的回复。但我们想要 AAC AudioEncoder。我尝试将 AudioSource 从 MIC 更改为 Default ,但没有帮助。
    • 你在哪里播放我的意思是在应用程序中的记录文件??还是通过手机播放器的sdcard文件??
    • 文件可以在Android应用和播放器中播放,但不能在ios端播放。
    【解决方案3】:

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

    【讨论】:

    • 我也同意你的观点(Android_Craker)。我已经遇到过这样的问题,唯一的解决方案是生成 android 支持格式的音频文件,即 mp3、mp4、3gp、wav 等。
    【解决方案4】:

    我也遇到了 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多