【问题标题】:Can I record 24/48k audio using AudioRecord?我可以使用 AudioRecord 录制 24/48k 音频吗?
【发布时间】:2015-09-04 05:29:32
【问题描述】:

我正在使用AudioRecord 录制音频。目前我使用 44100 作为采样率,16 位作为AudioFormat

我可以使用 48000 作为采样率,使用 24 位作为AudioFormat吗?

以下是采样率 44100 和音频格式为 16 位的代码。

    int SAMPLE_RATE = 44100;

    int mBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);        
    AudioRecord mRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE ,
            AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize);

    if (AudioRecord.STATE_INITIALIZED == mRecorder.getState()) {
        mRecorder.startRecording();
    }

根据Developer site,44100Hz 是可用的最高采样率。 我的问题是,我可以使用 48000Hz 的 24 位音频格式吗?

谢谢

根据link,我们可以使用每个样本 24 位来录制音频。 每个样本 24 位 使用 Android L,样本分辨率将从 16 位 PCM 增加到 24 位,以获得更好的结果。尽管 2013 年发布的许多智能手机都支持 24 位 96khz DAC,但 Android 操作系统始终无法使用它。

【问题讨论】:

    标签: android audio audiorecord sample-rate audioformat


    【解决方案1】:

    这肯定取决于您尝试录制的设备吗?硬件制造商必须在 HAL 中配置很多这样的东西。

    audio_policy.conf 应在您使用的设备上指明兼容的采样率和格式。您可以检查该文件 - 它通常在您的 android 设备上找到,可能在 system/etc/ 下

    例子:

    audio_hw_modules {
      primary {
        outputs {
          primary {
            sampling_rates  44100|48000
            channel_masks AUDIO_CHANNEL_OUT_STEREO
            formats AUDIO_FORMAT_PCM_16_BIT
            devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_AUX_DIGITAL
            flags AUDIO_OUTPUT_FLAG_PRIMARY
          }
        }
        inputs {
          primary {
            sampling_rates 8000|11025|16000|22050|32000|44100|48000
            channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO
            formats AUDIO_FORMAT_PCM_16_BIT
            devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET
          }
        }
      }
    

    在这种特殊情况下,我无法使用 48 KHz 的 24 位音频,但 16 位就可以了。

    【讨论】:

    • 从 Android 4.4.2 开始,在代码 (/frameworks/av/media/libmedia/AudioRecord.cpp) 中还有一条注释说 AudioFlinger 目前只支持 16Bit PCM。不过,这可能已经改变了
    • 我正在使用 USB 音频(USB 主机)录制音频。在 usb 下,fomat 已被提及为动态的。那么我可以使用 24 位进行 USB 音频录制吗? usb { 输出 { usb_device { sampling_rates 动态 channel_masks 动态格式 动态设备 AUDIO_DEVICE_OUT_USB_DEVICE } } 输入 { usb_device { sampling_rates 动态 channel_masks 动态格式动态设备 AUDIO_DEVICE_IN_USB_DEVICE } } }
    • 如果你找到了那个答案,我很想听听。
    【解决方案2】:

    简单的答案 - 对于大多数应用程序开发人员 - 不,你不能。

    冗长的答案 -

    • 如果您使用 Android SDK 构建应用程序,则无法使用,因为 SDK 没有为此定义任何常量。

    • 如果您有权访问 Android 的底层源代码,则构建整个源代码。然后您可以检查它们是否支持该采样频率和音频格式,然后您可以通过整个 android 堆栈公开它们并在您的应用程序中使用它。
      这种方法的问题是您无法将应用程序发布到任何设备,设备需要运行从相同源构建的完全相同的映像。这种方法通常适用于在自己的树中开发应用的 OEM 公司。

    【讨论】:

    • 感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2011-08-18
    相关资源
    最近更新 更多