J'ai utilisé la classe AudioRecord pour faire du traitement audio sur Android. C'est un peu un auteur-compositeur, et j'ai fait référence à certaines pages japonaises, mais j'ai peur qu'il y ait beaucoup de parties vagues dans les spécifications ...
Cela peut être difficile à comprendre sans une connaissance de base du traitement de la voix en premier lieu, mais il existe de nombreuses API telles que positionNotificationPeriod '' et
notificationMarkerPosition '' que vous ne comprenez pas ce qui est différent.
Donc, je vais laisser une note (code avec commentaires) du document officiel et des spécifications étudiées dans le test local.
AudioRecordSample.kt
import android.media.AudioFormat
import android.media.AudioRecord
import android.media.MediaRecorder
import android.util.Log
import kotlin.math.max
/**
*Exemple de code pour la classe AudioRecord
*/
class AudioRecordSample {
//Taux d'échantillonnage(Hz)
//La garantie de prise en charge de tous les appareils est uniquement 44100
private val samplingRate = 44100
//fréquence d'images(fps)
//Combien de fois vous souhaitez traiter des données audio par seconde
//Décidez vous-même
private val frameRate = 10
//1 trame de données audio(=Valeur courte)Nombre de
private val oneFrameDataCount = samplingRate / frameRate
//Nombre d'octets de données audio dans une trame(byte)
// Byte = 8 bit, Short =Parce que c'est 16 bits,Double court
private val oneFrameSizeInByte = oneFrameDataCount * 2
//Taille du tampon de données audio(byte)
//Exigence 1:Doit être plus grand que oneFrameSizeInByte
//Exigence 2:Doit être supérieur au minimum requis par l'appareil
private val audioBufferSizeInByte =
max(oneFrameSizeInByte * 10, //Fournit un tampon pour 10 images
android.media.AudioRecord.getMinBufferSize(samplingRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT))
fun startRecording() {
//Créer une instance
val audioRecord = AudioRecord(
MediaRecorder.AudioSource.MIC, //Source audio
samplingRate, //Taux d'échantillonnage
AudioFormat.CHANNEL_IN_MONO, //Paramètres de chaîne.MONO et STEREO garantissent la prise en charge de tous les appareils
AudioFormat.ENCODING_PCM_16BIT, //PCM16 garantit la prise en charge de tous les appareils
audioBufferSizeInByte) //tampon
//Combien de données vocales traiter( =Nombre de données dans une trame)
audioRecord.positionNotificationPeriod = oneFrameDataCount
//Au moment où le nombre spécifié ici est atteint,La suite onMarkerReached est appelée
//Cela ne semble-t-il pas nécessaire pour un traitement de streaming normal?
audioRecord.notificationMarkerPosition = 40000 //Ne pas définir s'il n'est pas utilisé.
//Array pour stocker les données vocales
val audioDataArray = ShortArray(oneFrameDataCount)
//Spécifier le rappel
audioRecord.setRecordPositionUpdateListener(object : AudioRecord.OnRecordPositionUpdateListener {
//Traitement pour chaque image
override fun onPeriodicNotification(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) //Lire les données audio
Log.v("AudioRecord", "onPeriodicNotification size=${audioDataArray.size}")
//Traitez comme vous le souhaitez
}
//Traitement de la synchronisation des marqueurs.
//Appelé lorsque notificationMarkerPosition est atteint
override fun onMarkerReached(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) //Lire les données audio
Log.v("AudioRecord", "onMarkerReached size=${audioDataArray.size}")
//Traitez comme vous le souhaitez
}
})
audioRecord.startRecording()
}
}
C'est juste basique. Je l'écrirai à nouveau si je peux obtenir des informations plus avancées telles que les performances.
Recommended Posts