簡體   English   中英

使用Android NDK錄音

[英]Audio Record using Android NDK

我嘗試使用android ndk錄制音頻。 人們說我可以使用“frameworks / base / media / libmedia / AudioRecord.cpp”。 但它在內核中。 我該如何訪問和使用它?

C ++ libmedia庫不是公共API的一部分。 有些人使用它,但這是非常氣餒的,因為它可能會破壞某些設備和/或未來的Android版本。

我開發了一個錄音應用程序,並且相信我,音頻支持在各個設備上非常不一致,這非常棘手 ,所以IMO直接使用libmedia是一個壞主意。

使用公共API捕獲原始音頻的唯一方法是使用Java AudioRecord類。 它將為您提供PCM數據,然后您可以選擇將其傳遞給C優化的例程。

或者,雖然這有點困難,但您可以圍繞Java AudioRecord類編寫C / C ++包裝器,因為可以通過JNI實例化Java對象和調用方法。

可能有點過時但是:

  1. 在本機代碼中播放/錄制音頻最安全的方法是使用OpenSL ES接口。 盡管如此,它僅適用於Android 2.3+,目前適用於通用的AudioFlinger API。

  2. 更健壯,更簡單的方法是使用平台源代碼獲取AudioFlinger頭文件和一些通用libmedia.so用於在構建階段進行鏈接。 依賴於設備的libmedia.so應該在應用程序初始化階段預加載,以使AudioFlinger正常工作(通常是自動完成)。 請注意,一些供應商嘗試更改AudioFlinger內部(由於含糊不清的原因),因此您可能會遇到一些內存或行為問題。

根據我的經驗,AudioFlinger可以處理所有(2.0+)設備,但有時需要為對象分配比默認實現時更多的內存。

最后說OpenSL ES是一個帶有可動態加載的C接口的包裝器,允許將它與任何特定的AudioFlinger實現一起使用。 這對於簡單的使用來說非常復雜,並且由於內部線程,緩沖等原因,可能比使用Java AudioTrack / AudioRecord有更多的開銷。所以考慮使用Java或不那么安全的原生AudioFlinger,直到Google實現一些高性能音頻界面(現在很值得懷疑)。

OpenSL Es API可從Android 2.3開始(API級別9)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM