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