Не удается воспроизвести записанный аудиофайл с Android в iOS 5+

Я работаю над приложением для Android, которое также поддерживает iOS. Я хочу записать звук и воспроизвести его на устройствах 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 на устройстве Android, но устройство iOS не может воспроизводить звук, записанный на устройстве Android. Он возвращает OSStatus error 1937337955. Я искал об этой ошибке, но ничего не нашел.

Может ли кто-нибудь сказать мне, что происходит не так в моем коде?

Любая помощь высоко ценится. Заранее спасибо.


person PrvN    schedule 01.02.2013    source источник
comment
@PrvN: это решено? у меня тоже такая же проблема.   -  person LiangWang    schedule 17.04.2014


Ответы (4)


Попробуй это:

audioRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
person SubbaReddy PolamReddy    schedule 01.02.2013
comment
Спасибо за ответ. Но нам нужен AAC AudioEncoder. Я попытался изменить AudioSource на Default с MIC , но это не помогает. - person PrvN; 01.02.2013
comment
где ты проигрываешь файл записи, я имею в виду в приложении?? или файл sdcard через плеер в мобильном?? - person SubbaReddy PolamReddy; 01.02.2013
comment
Файл также можно воспроизводить в приложении и плеере Android, но не на стороне ios. - person PrvN; 01.02.2013

Это проблема с кодеком, формат, записанный iOS, не может декодироваться медиаплеером Android, чтобы заставить его работать, просто декодируйте аудиофайл на стороне IOS в формат, поддерживаемый Android, например mp3, mp4 или 3Gp и т. д.

person Mahesh    schedule 26.03.2013
comment
Я также согласен с вами (Android_Craker). Я уже сталкивался с такой проблемой, и единственным решением является создание аудиофайла в формате, поддерживаемом Android, то есть mp3, mp4, 3gp, wav и т. д. - person Shailendra; 29.07.2013

Я столкнулся с той же проблемой, когда звук, записанный с устройства Samsung, не работает на всех устройствах IOS и даже в браузере Safari. Но они отлично работают на всех устройствах Android. Я исправил эту проблему, добавив следующие строки в класс AudioRecordingUtil:

recorder!!.setAudioSource(MediaRecorder.AudioSource.MIC)
recorder!!.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS)
recorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)

Надеюсь, это может помочь!

person Hardik Hirpara    schedule 31.03.2020

У меня также возникли проблемы с 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, но Audio не работал в 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();
    }
}
person Kul Bhushan Prasad    schedule 18.05.2021