Skip to main content

AndroidのAudioRecordの基本を理解する

 Androidで音声処理をするために、AudioRecordクラスを利用しました。これがいくつかの日本語ページを参照しましたが、どうも仕様に曖昧な部分が多かった。。。
 そもそも音声処理の基本知識がないと理解しづらいのもあると思いますが、positionNotificationPeriodとかnotificationMarkerPositionなどの何が違うのかよくわからないAPIも多いです。ということで、公式ドキュメント及びローカルテストで順調した仕様をメモ(コメント付きのコード)に残します。
・Android API:27 (Anroid 8.1 Oreo)
・Kotlin

import android.media.AudioRecord
import android.media.MediaRecorder
import android.util.Log
import kotlin.math.max /**
* AudioRecord クラスのサンプルコード
*/
class AudioRecordSample { // サンプリングレート (Hz)
// 全デバイスサポート保障は44100のみ
private val samplingRate = 44100 // フレームレート (fps)
// 1秒間に何回音声データを処理したいか
// 各自好きに決める
private val frameRate = 10 // 1フレームの音声データ(=Short値)の数
private val oneFrameDataCount = samplingRate / frameRate // 1フレームの音声データのバイト数 (byte)
// Byte = 8 bit, Short = 16 bit なので, Shortの倍になる
private val oneFrameSizeInByte = oneFrameDataCount * 2 // 音声データのバッファサイズ (byte)
// 要件1:oneFrameSizeInByte より大きくする必要がある
// 要件2:デバイスの要求する最小値より大きくする必要がある
private val audioBufferSizeInByte =
max(oneFrameSizeInByte * 10, // 適当に10フレーム分のバッファを持たせた
android.media.AudioRecord.getMinBufferSize(samplingRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT)) fun startRecording() { // インスタンスの作成
val audioRecord = AudioRecord(
MediaRecorder.AudioSource.MIC, // 音声のソース
samplingRate, // サンプリングレート
AudioFormat.CHANNEL_IN_MONO, // チャネル設定. MONO and STEREO が全デバイスサポート保障
AudioFormat.ENCODING_PCM_16BIT, // PCM16が全デバイスサポート保障
audioBufferSizeInByte) // バッファ // 音声データを幾つずつ処理するか( = 1フレームのデータの数)
audioRecord.positionNotificationPeriod = oneFrameDataCount // ここで指定した数になったタイミングで, 後続の onMarkerReached が呼び出される
// 通常のストリーミング処理では必要なさそう?
audioRecord.notificationMarkerPosition = 40000 // 使わないなら設定しない. // 音声データを格納する配列
val audioDataArray = ShortArray(oneFrameDataCount) // コールバックを指定
audioRecord.setRecordPositionUpdateListener(object : AudioRecord.OnRecordPositionUpdateListener { // フレームごとの処理
override fun onPeriodicNotification(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) // 音声データ読込
Log.v("AudioRecord", "onPeriodicNotification size=${audioDataArray.size}")
// 好きに処理する
} // マーカータイミングの処理.
// notificationMarkerPosition に到達した際に呼ばれる
override fun onMarkerReached(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) // 音声データ読込
Log.v("AudioRecord", "onMarkerReached size=${audioDataArray.size}")
// 好きに処理する
}
}) audioRecord.startRecording()
}
}
import android.media.AudioFormat

簡単にまとめると、
・samplingRate : サンプリングレート(Hz)。
 全デバイスサポート保障は44100のみ
・frameRate:フレームレート(fps)。
 1秒に何回音声を処理したいか。各自好きに決める。
・oneFrameDataCount:1フレームの音声データ(=Short値)の数
・oneFrameSizeInByte:1フレームの音声データのバイト数(byte)
 Byte = 8 bit, Short = 16 bitなので、Shortの倍になる。
・audioBufferSizeInByte:音声データのバッファサイズ(byte)
 条件1:onFrameSizeInByteより大きくする必要がある。
 条件2:デバイスの要求する最小値より大きくする必要がある

Comments

Popular Posts

Hướng dẫn sửa lỗi "File is changed: W[2007] L[2]" Đột Kích

Đây là lỗi game rất nhiều người (trong đó có mình mắc phải). Tuy nhiên khi lên diễn đàn hỏi thì các MOD đều trả lời 1 câu là tải game về cài lại rồi close luôn topic. Mình rất không hài lòng về điều đó. Hình ảnh ví dụ về lỗi : Và dưới đây là cách mình sửa. Tải trên mạng File bị lỗi (Có ghi tên file khi CF thông báo lỗi) hoặc copy từ máy tính khác về. Replace vào thư mục của nó. Vậy là ok. Các bạn nào hỏng file nào thì tải về rồi replace nó. Nếu ko có thì comment ở dưới, mình sẽ upload sớm nhất có thể cho các bạn. Video hướng dẫn :

Vì sao nên chơi LOL server NA (Bắc Mĩ)

Dưới đây là những lí do mình khuyên bạn nên chơi Liên minh server Bắc Mỹ : 1. Giá 1 số tướng rẻ hơn server VN 2. Chế độ chọn tướng, chọn vị trí rồi mới chọn đội 3. Quà tặng cho tân thủ nhiều hơn (Tristana (tướng + skin) + Alistar (tướng + skin)) 4. Nhiều icon cho bạn lựa chọn 5. Số lượng gói combo nhiều hơn 6. Có thể chuyển tài khoản đến các vùng khác trên thế giới  7. Có thể hoàn lại những vật phẩm đã mua (Cả bằng IP lẫn RP) 8. Trình độ bên đó cao hơn hẳn server VN và ko có trẻ trâu, cãi nhau rất ít. Hướng dẫn chuyển server VN sang NA :  http://ngdinhnha.blogspot.com/2014/04/chia-se-huong-dan-choi-lol-tat-ca.html Tải game tại :  https://signup.leagueoflegends.com/en/signup/redownload Đăng kí  tài khoản LOL NA tại :  https://signup.leagueoflegends.com/en/signup/index

How to play League of Legends server Japan Closed Beta - Testing account

The first, you need League of Legends by Riot. (Here, I am playing in server North America) Download Next, Click to  North America. Then, Click to North America. Then, Click Japan And Save Waiting for download Japanese version. League of Legends server Japan Closed Beta is starting from February 4th. This is testing account :  Good luck ! Video :