世博会录音webm

时间:2018-02-02 12:33:01

标签: android audio react-native audio-recording expo

我正在使用expo,我正在尝试使用webm输出格式(Expo.Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_WEBM)在Android上进行记录。我的问题是我已经尝试了所有不同的编码器,但它们似乎都没有用。我期待vorbis编码器可以工作(Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_VORBIS),但我总是回到异常

    {
        "tryLoc": "root",
        "completion": {
            "type": "throw",
            "arg": {
                "framesToPop": 1,
                "code": "E_AUDIO_RECORDING",
                "message": "Start encountered an error: recording not started",
                "stack": "Error: Start encountered an error: recording not started\n    at createErrorFromErrorData (blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2297:17)\n    at blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2249:27\n    at MessageQueue.__invokeCallback (blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2691:18)\n    at blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2436:18\n    at MessageQueue.__guardSafe (blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2604:11)\n    at MessageQueue.invokeCallbackAndReturnFlushedQueue (blob:http://172.16.6.80:19001/96c6e3c7-f483-40d9-a3ad-7a7114468a07:2435:14)\n    at http://172.16.6.80:19001/debugger-ui/debuggerWorker.js:72:58"
            }
        }
    }

这是我正在尝试的配置:

const recording = new Audio.Recording();
debugger;
await recording.prepareToRecordAsync({
  android: {
    extension: '.webm',
    outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_WEBM,
    audioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_VORBIS,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000
  },
  ios: {
    extension: '.wav',
    audioQuality: Audio.RECORDING_OPTION_IOS_AUDIO_QUALITY_MAX,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
    linearPCMBitDepth: 16,
    linearPCMIsBigEndian: false,
    linearPCMIsFloat: false,
  },
});

关于为什么会发生这种情况的想法以及我必须使用的适当编码器是什么?

2 个答案:

答案 0 :(得分:0)

我在黑暗中拍摄,希望这可能有所帮助。

启用音频和自定义音频模式

  

Expo.Audio.setIsEnabledAsync(value)默认启用音频,但是   如果你想在一个分离的应用程序中编写自己的Audio API,你可能会   想要禁用Expo Audio API。

     

参数value(boolean) - true启用Expo Audio,false   禁用它。

     

返回一个Promise,如果音频播放不能,它将拒绝   已启用该设备。

     

Expo.Audio.setAudioModeAsync(mode)我们提供此API进行自定义   iOS和Android上的音频体验。

这些关键值对也可能有所帮助。

  • prepareToRecordAsync()
  • stopAndUnloadAsync()

音频编码器列表:(*我建议使用默认调试它)

<强> audioEncoder

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_DEFAULT

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AMR_NB

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AMR_WB

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_HE_AAC

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC_ELD

  • Expo.Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_VORBIS

参考expo.io(13 / Feb / 2018)。

注意* .webm(仅在Android 4.0及以上版本中可流动)

参考developer.android.com(13 / Feb / 2018)。

尝试使用以下代码,高低质量和android&amp; IOS:

  export const RECORDING_OPTIONS_PRESET_HIGH_QUALITY: RecordingOptions = {
  android: {
    extension: '.m4a',
    outputFormat: RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_MPEG_4,
    audioEncoder: RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
  },
  ios: {
    extension: '.caf',
    audioQuality: RECORDING_OPTION_IOS_AUDIO_QUALITY_MAX,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
    linearPCMBitDepth: 16,
    linearPCMIsBigEndian: false,
    linearPCMIsFloat: false,
  },
};

export const RECORDING_OPTIONS_PRESET_LOW_QUALITY: RecordingOptions = {
  android: {
    extension: '.3gp',
    outputFormat: RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_THREE_GPP,
    audioEncoder: RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AMR_NB,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
  },
  ios: {
    extension: '.caf',
    audioQuality: RECORDING_OPTION_IOS_AUDIO_QUALITY_MIN,
    sampleRate: 44100,
    numberOfChannels: 2,
    bitRate: 128000,
    linearPCMBitDepth: 16,
    linearPCMIsBigEndian: false,
    linearPCMIsFloat: false,
  },
};

参考expo.io(13 / Feb / 2018)。

答案 1 :(得分:0)

我发现了两个问题。一个是 Expo 的一个神秘问题,如果我从文档(源代码)中复制高清晰度并在本地使用,它将无法注册。我最终回到了他们的一个例子,它只是简单地开始/停止录音并继续工作,没有任何问题。我挖了一段时间,我的结论是必须严格遵循一系列初始化才能使这些设置的初始化被接受。

解决上一个问题后,我发现以下内容适用于 Google Speech to Text。 AWS 表示他们也接受 AMR 音频。

    android: {
      extension: '.amr',
      outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_AMR_WB,
      audioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AMR_WB,
      sampleRate: 16000,
      numberOfChannels: 1,
      bitRate: 128000,
    },