如何在 iPhone 上以低采样(约 1000 Hz)录制

Posted

技术标签:

【中文标题】如何在 iPhone 上以低采样(约 1000 Hz)录制【英文标题】:How to record at a low sample (around 1000 Hz) on an iPhone 【发布时间】:2017-01-27 20:43:49 【问题描述】:

我正在编写一个应用程序来使用 iPhone 6 上的内置麦克风录制单声道音频。当配置为以 8000 Hz 录制时,这些应用程序可以正常工作。这是代码

    // Set up audio session
    let session = AVAudiosession.sharedInstance()

    // Configure audio session
    do 
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord)

        var recordSettings = [String:AnyObject]()
        recordSettings[AVFormatIDKey] = Int(kAudioFormatLinearPCM) as AnyObject

        // Set the sampling rate
        recordSettings[AVSampleRateKey] = 8000.0 as AnyObject
        recordSettings[AVNumberOfChannelsKey] = 1 as AnyObject

        recorder = try AVAudioRecorder(url: outputFileURL, settings: recordSettings)

        recorder?.delegate = self
        recorder?.isMeteringEnabled = true

        recorder?.prepareToRecord()

        return true

    
    catch 
        throw Error.AVConfiguration
    

为了减少存储需求,我希望以低得多的采样率(理想情况下低于 1000 Hz)进行录制。如果我将采样率设置为 1000 Hz,则应用以 8000 Hz 记录。

根据 Apple 的文档,

硬件采样率的可用范围取决于设备。它通常在 8000 到 48000 赫兹之间。

问题...是否可以使用AVAudioSession(或其他框架)以低采样率录制音频?

【问题讨论】:

你为什么不使用不同的格式,比如 aac 而不是未压缩的 pcm?如果您使用编解码器,文件大小将大大减少 我假设您真的需要 无损 记录 ~50-500Hz 范围内的频率(麦克风的近似限制高达 nyqvist 限制)?否则,这是一种非常糟糕的节省空间的方式。 【参考方案1】:

iPhone 上的音频录制是使用硬件编解码器制作的,因此可用的帧速率是硬编码的,无法更改。但是,如果您需要 1kHz 的采样率,您可以以 8kHz 进行录制,而不仅仅是重新采样,您可以使用一些重新采样库进行记录。就个人而言,我更喜欢将 ffmpeg 用于此类任务。

【讨论】:

这是正确的答案,但我要补充一点,如果只需要重新采样,可能像 libresample 或 libsoxr 这样较小的库比整个 ffmpeg 更容易集成。【参考方案2】:

我希望您知道,通过niquist theorem,您无法期望非常有用的结果您尝试实现的目标。

也就是说,除了您只针对低频。对于这种情况,您可能需要先使用低通滤波器。 几乎不可能理解 olny 频率低于500 Hz 的声音。语音通常被认为需要3 kHz,这使得采样率为6000

对于你必须期待的一个示例,请尝试以下类似的操作:

ffmpeg -i tst.mp3 -ar 1000 tst.wav

例如一些人声和听结果。 但是,您可以使用例如实现一些可接受的折衷。采样率为 3000。

另一种方法是按照@manishg 的建议进行一些压缩 即时。由于如今的智能手机可以实时进行视频压缩,这对于 iPhone 的硬件和软件来说应该是完全可行的。但这与降低采样率是完全不同的。

【讨论】:

以上是关于如何在 iPhone 上以低采样(约 1000 Hz)录制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 上以调试/开发模式运行我的混合移动应用程序?

如何在 iPhone 上以编程方式在 Swift 中将 UIViewController 呈现为弹出框

如何修改 SpeakHere 示例应用程序以在 iPhone 上以单声道格式录制?

在 iPhone 上以编程方式打开蓝牙

iPhone App 无法在 ipad 上以 2 倍分辨率运行

在 iPhone 上以最小的文件大小录制音频