expo-av: Audio files recorded on iOS can not be played on Android

I am developing an application compatible with both iOS and Android.
It is a chat application that can be recorded and played back.
Recorded audio data is stored on Firebase Storage.

The problem that occurred is,

  • Audio recorded on iOS can not be played on Android

I expect this to be a file format issue.
Is there an appropriate setting for both iOS and Android?

Some of the settings are described below.

Recorder

import { Audio } from 'expo-av';
import * as Permissions from 'expo-permissions';

const recording = new Audio.Recording();
const recordOptions = Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY;
recordOptions.ios.outputFormat = Audio.RECORDING_OPTION_IOS_OUTPUT_FORMAT_MPEG4AAC;

Audio.setAudioModeAsync({
  allowsRecordingIOS: true,
  staysActiveInBackground: false,
  interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
  playsInSilentModeIOS: true,
  shouldDuckAndroid: true,
  interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
  playThroughEarpieceAndroid: true,
})

const startRecord = async () => {
  recording.prepareToRecordAsync(recordOptions)
  await recording.startAsync();
}

const stopRecord = async () => {
  await recording.stopAndUnloadAsync();
  // Upload Firebase Storage, contentType: 'audio/aac',
}

Player

import { Audio } from 'expo-av';

const soundObject = new Audio.Sound();

const play = async () => {
  await soundObject.loadAsync({ uri: src }, { androidImplementation: 'MediaPlayer' });
  await soundObject.playAsync();
}

Error

Error: Load encountered an error: the OnErrorListener was called with 'what' code 1 and 'extra' code -2147483648.
    at createErrorFromErrorData (NativeModules.js:155)
    at NativeModules.js:104
    at MessageQueue.__invokeCallback (MessageQueue.js:414)
    at MessageQueue.js:127
    at MessageQueue.__guard (MessageQueue.js:314)
    at MessageQueue.invokeCallbackAndReturnFlushedQueue (MessageQueue.js:126)
    at debuggerWorker.js:80

It resolved after adding this.

recordOptions.ios.extension = '.m4a';
4 Likes

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.