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 chơi Liên Minh Huyền Thoại tất cả server SEA, TAIWAN, NA (Bắc Mĩ)

Cách 1 : Tải trực tiếp server NA (Bắc Mỹ) Cách 2 : Nếu không được các bạn có thể tham khảo cách dưới đây : 1- Tìm file lol.properties trong thư mục: \GameData\Apps\lolVN\Air 2- Mở file lol.properties bằng notepad trong thư mục kia ra, xóa tất cả đi copy toàn bộ dòng dưới vào rồi lưu lại là xong ! Server VN: Code: host=prodvn.lol.garenanow.com xmpp_server_url=chatvn.lol.garenanow.com xmpp_accept_self_signed_cert=true startChat=true storeEnabled=true enableTutorialGame=true lobbyLandingURL=http://lol.garena.com/landing.php ladderURL=http://lienminh.garena.vn/ helpURL=http://lienminh.garena.vn/support lq_uri=https://lqvn.lol.garenanow.com storyPageURL=http://lienminh.garena.vn/ Server SEA: Code: host=prod.lol.garenanow.com xmpp_server_url=chat.lol.garenanow.com xmpp_accept_self_signed_cert=true startChat=true storeEnabled=true enableTutorialGame=true lobbyLandingURL=http://lol.garena.com/landing.php ladderURL=http://lol.garena.com/ladders helpURL=http://lol.garena...

Phần mềm tắt UPnP - Sửa lỗi Unable to join game Đế Chế

Sửa lỗi unable to join game đế chế, không thể thấy room đế chế. Một số máy tính không thể join game hoặc thấy mạng của bạn mình thì hãy làm theo cách của mình. Tải phần mềm UnPnp.exe Bật lên bạn sẽ thấy chữ ở vị trí 2 màu đỏ. Click vào 1 thì vị trí số 2 sẽ sang màu xanh như hình. Lưu ý : Nếu vị trí số 1 không phải là Enable UPnP hoặc Disable UPnP thì mọi người hãy mở file UnPnP.exe bằng cách click phải vào file, chọn Run as Administrator ----> OK. Chúc các bạn thành công và chơi game vui vẻ !

Hướng dẫn chơi Liên Minh Huyền Thoại server Nhật Bản Closed Beta - Tặng tài khoản chơi thử

Trước hết, các bạn cần bản Liên Minh Huyền Thoại bản gốc của Riot (Server Bắc Mỹ (NA), châu Âu, Turkey, ...) Link tải Liên Minh Huyền Thoại bản gốc của Riot: https://signup.leagueoflegends.com/en/signup/redownload Sau đó, vào góc màn hình bấm chọn dấu mũi tên đi xuống cạnh North America (cái này thì tùy vì mình chơi server NA) Chọn  North America Một bảng hiện ra chọn Japan Chọn Save Đợi Liên Minh Huyền Thoại update bản tiếng Nhật về. Closed Beta bắt đầu từ ngày 4 tháng 2 năm 2016 mà hôm mình viết bài này mới chỉ 3/2/2016 nên phải đợi qua ngày mới cho test nhé. Dưới đây là 1 số account mình được tặng để test nhé : Video hướng dẫn :