世博录音webm

Posted

技术标签:

【中文标题】世博录音webm【英文标题】:Expo audio recording webm 【发布时间】:2018-07-12 23:03:31 【问题描述】:

我正在使用 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); 如果用户授权录音,则 const status 的值为 granted @shimatai - 是的,我要求适当的权限。我可以使用outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_AAC_ADTSaudioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC 进行录制,但理想情况下我希望使用 webm。 你有没有让这个工作?我的观察是,当我在我的代码中复制 HIGH 质量定义(使用修改后的名称)然后引用本地定义时,它会被忽略并且低质量记录,3gp vs m4a,结果。 @FitterMan 据我所知,我找不到适合我的东西。我最终创建了一个后端服务,发送我从 ios 和 android 获得的任何内容,并使用 AWS 转码对其进行转码。这并不理想,但可以满足我们的需求。 【参考方案1】:

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

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

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

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

如果无法播放音频,则返回一个拒绝的 Promise 为设备启用。

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

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

prepareToRecordAsync() stopAndUnloadAsync()

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

音频编码器

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 - 使用上面的代码作为指南,看看它是否适用于您当前的设置。【参考方案2】:

我发现了 2 个问题。一个是 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,
    ,

【讨论】:

以上是关于世博录音webm的主要内容,如果未能解决你的问题,请参考以下文章

录音怎么保存到手机

怎么保存电话录音

华为手机录音文件放在哪里

录音怎么保存 如何保存电话录音

如何把歌曲保存到录音里?

电话录音怎么保存起来