Android 世博录音网

Android 世博录音网,android,audio,react-native,audio-recording,expo,Android,Audio,React Native,Audio Recording,Expo,我正在使用expo,我正在尝试使用webm输出格式在android上录制(expo.Audio.RECORDING\u OPTION\u android\u output\u format\u webm)。我的问题是,我已经尝试了所有不同的编码器,但它们似乎都不起作用。我原以为vorbis编码器可以工作(Expo.Audio.RECORDING\u OPTION\u ANDROID\u Audio\u encoder\u vorbis)但我总是得到一个异常 { "tryL

我正在使用expo,我正在尝试使用webm输出格式在android上录制(
expo.Audio.RECORDING\u OPTION\u android\u output\u format\u webm
)。我的问题是,我已经尝试了所有不同的编码器,但它们似乎都不起作用。我原以为vorbis编码器可以工作(
Expo.Audio.RECORDING\u OPTION\u ANDROID\u Audio\u encoder\u 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,
  },
});

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

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

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

默认情况下启用Expo.Audio.setIsEnabledAsync(value)Audio,但 如果你想在一个独立的应用程序中编写自己的音频API,你可以 要禁用Expo音频API

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

返回一个承诺,如果无法播放音频,该承诺将被拒绝 已为设备启用

setAudioModeAsync(mode)我们提供这个API来定制 iOS和Android上的音频体验

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

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

音频编码器

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u默认值

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u AMR\u NB

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u AMR\u WB

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u AAC

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u HE\u AAC

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u AAC\u ELD

  • Expo.Audio.RECORDING\u选项\u ANDROID\u音频\u编码器\u VORBIS

参考资料:(2018年2月13日)

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

参考资料:(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,
  },
};

参考资料:(2018年2月13日)。

我发现了两个问题。一个是世博会的一个神秘问题,如果我从文档(源代码)中复制高清晰度并在本地使用,它将无法注册。我最终回到了他们的一个例子,只做了一个简单的开始/停止录制,然后继续工作,没有任何问题。我仔细研究了一会儿,得出的结论是,要接受这些设置的初始化,必须严格遵循初始化顺序

一旦解决了上一个问题,我发现下面的方法与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,
    },

在尝试录制之前,您是否已获得许可
const{status}=wait Expo.Permissions.askAsync(Expo.Permissions.AUDIO_RECORDING)
如果用户授权录音,const
状态
的值将被授予。@shimatai-是,我要求获得适当的权限。我可以使用
outputFormat:Audio.RECORDING\u OPTION\u ANDROID\u OUTPUT\u FORMAT\u AAC\ADTS
audioEncoder:Audio.RECORDING\u OPTION\u ANDROID\u Audio\u ENCODER\u AAC
进行录制,但理想情况下我希望使用webm。你有过这样的功能吗?我的观察是,当我在代码中复制高质量的定义(使用修改过的名称),然后引用本地定义时,它被忽略,低质量的录制(3gp vs m4a)会产生结果。@FitterMan据我所知,我找不到适合我的东西。我最终创建了一个后端服务,发送我从ios和android获得的任何信息,并使用AWS transcode对其进行转码。它并不理想,但满足了我们的需求。除了
setIsEnabledAsync
之外,我已经使用了上面的所有东西,因为应用程序尚未分离。是否有一个特定的组合可以工作?我可以用我提供给
Expo.Audio.setAudioModeAsync
prepareToRecordAsync
stopanduloadasync
@stavros.zavrakas的配置来证明这一点-使用上述代码作为指南,看看它是否能与当前设置一起工作。