博览会音频录制webm

13

我正在使用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,
  },
});

有没有关于为什么会发生这种情况以及我需要使用哪种适当的编码器的想法?


在尝试录音之前,您是否已经请求了权限? const { status } = await Expo.Permissions.askAsync(Expo.Permissions.AUDIO_RECORDING); 如果用户授权录音,则常量status将具有值“granted”。 - shimatai
@shimatai - 是的,我已经请求了适当的权限。我能够使用 outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_AAC_ADTSaudioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC 进行录制,但最好能够使用 webm 格式。 - Stavros Zavrakas
你最终解决了这个问题吗?我的观察是,当我在代码中复制“高质量”定义(并修改名称),然后引用本地定义时,它会被忽略,结果是低质量的录音,即3gp而不是m4a。 - Fitter Man
据我所记,@FitterMan,我当时找不到适合我的解决方案。最终,我创建了一个后端服务,将从iOS和Android获取的任何内容发送并使用AWS转码进行转码。虽然不是理想的解决方案,但已经满足了我们的需求。 - Stavros Zavrakas
2个回答

1

我是在瞎猜,希望这能有所帮助。

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

Expo.Audio.setIsEnabledAsync(value) 音频默认已启用,但如果您想在分离的应用程序中编写自己的音频API,则可能希望禁用Expo音频API。

参数value(布尔值)-true启用Expo音频,false禁用它。

返回一个Promise,如果设备无法启用音频播放,则会拒绝该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(2018年2月13日)。

注意:*.webm(仅在Android 4.0及以上版本中可流式传输)

参考: developer.android.com (2018年2月13日)。

尝试使用以下代码,高质量和低质量以及Android和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 (2018年2月13日)。


除了 setIsEnabledAsync,我已经使用了上述所有内容,因为应用程序尚未分离。有没有特定的组合可以工作?我可以提供给 Expo.Audio.setAudioModeAsyncprepareToRecordAsyncstopAndUnloadAsync 的配置。 - Stavros Zavrakas
@stavros.zavrakas - 使用上述代码作为指南,看看它是否可以与您当前的设置配合使用。 - BH7

0

我发现了两个问题。其中一个是关于Expo的神秘问题,如果我复制文档中的高清晰度(源代码)并在本地使用,则会注册失败。最终我返回到他们的一个简单的开始/停止示例,并且没有任何问题。我挖掘了一段时间,我的结论是必须按照精确的初始化序列才能接受这些设置的初始化。

在解决了之前的问题后,我发现以下内容与Google语音转文字配合使用。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,
    },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接