如何在 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 上以单声道格式录制?