Controlador de audio personalizado (Android)
Visión general
El SDK de OpenTok para Android te permite configurar un controlador de audio personalizado para emisores y suscriptores. Puedes utilizar un controlador de audio personalizado para personalizar el audio que se envía a la transmisión de un emisor. También puedes personalizar la reproducción del audio de las transmisiones a las que estás suscrito.
Configuración de tu proyecto
El código de esta sección está disponible en el proyecto «Basic-Audio-Driver-Java» de la opentok-android-sdk-ejemplos repositorio. Si aún no lo has hecho, tendrás que clonar el repositorio en un directorio local. En la línea de comandos, ejecuta:
git clone git@github.com:Vonage/vonage-video-android-sdk-samples.git
Abra el Audio básico en Java proyecto en Android Studio para seguir el tutorial.
Nota: En este tutorial se explica la versión en Java de la aplicación de ejemplo para Android. Para ver una versión en Kotlin con documentación, consulta el Repo de aplicaciones de ejemplo para Android.
Paso 1: Añadir un controlador de audio personalizado
Esta aplicación de ejemplo utiliza el controlador de audio personalizado para emitir ruido blanco (una señal de audio aleatoria) a su flujo de audio. También utiliza el controlador de audio personalizado para capturar el audio de los flujos a los que está suscrita y guardarlo en un archivo.
Configuración del dispositivo de audio y del bus de audio
Al utilizar un controlador de audio personalizado, se define dicho controlador y un bus de audio para que los utilice la aplicación.
El NoiseAudioDevice La clase define una interfaz básica de dispositivo de audio para que la utilice la aplicación. Se deriva de la BaseAudioDevice clase, definida por el SDK de OpenTok para Android. Para utilizar un controlador de audio personalizado, llama a la función AudioDeviceManager.setAudioDevice() método. Este ejemplo establece el dispositivo de audio en una instancia del método NoiseAudioDevice clase:
AudioDeviceManager.setAudioDevice(noiseAudioDevice);
Utiliza el AudioSettings clase, definida en el SDK de OpenTok para Android, para definir el formato de audio que utiliza el controlador de audio personalizado. La NoiseAudioDevice() El constructor crea dos instancias de AudioSettings una para el capturador de audio personalizado y otra para el renderizador de audio personalizado. Establece la frecuencia de muestreo y el número de canales para cada uno:
public NoiseAudioDevice(Context context) {
this.context = context;
captureSettings = new AudioSettings(SAMPLING_RATE, NUM_CHANNELS_CAPTURING);
rendererSettings = new AudioSettings(SAMPLING_RATE, NUM_CHANNELS_RENDERING);
capturerStarted = false;
rendererStarted = false;
audioDriverPaused = false;
capturerHandler = new Handler();
rendererHandler = new Handler();
}
El constructor también establece algunas propiedades locales que informan si el dispositivo está capturando o renderizando. También establece una instancia de Handler para procesar el archivo capturer Objeto ejecutable.
El NoiseAudioDevice.getAudioBus() obtiene el método AudioBus que utiliza este dispositivo de audio, definida por la etiqueta NoiseAudioDevice.AudioBus clase. Utilice la AudioBus instancia para enviar y recibir muestras de audio hacia y desde una sesión. El editor accederá a la AudioBus para obtener las muestras de audio. Los suscriptores enviarán muestras de audio (de los flujos suscritos) al objeto AudioBus.
Grabación de audio para su uso por parte de una editorial
El BaseAudioDevice.startCapturer() El método se invoca cuando el dispositivo de audio debe comenzar a capturar el audio que se va a publicar. El NoiseAudioDevice de este método inicia el capturer hilo que se ejecutará en la cola después de 1 segundo:
public boolean startCapturer() {
capturerStarted = true;
capturerHandler.postDelayed(capturer, capturerIntervalMillis);
return true;
}
El capturer produce un búfer que contiene muestras de datos aleatorios (ruido blanco). A continuación, llama a la función writeCaptureData() método del AudioBus que envía las muestras al bus de audio. El editor de la aplicación utiliza las muestras enviadas al bus de audio para transmitirlas como audio en el flujo publicado. Entonces, si todavía hay una captura en curso (si la aplicación está publicando), el objeto capturer El hilo se ejecuta de nuevo al cabo de otro segundo:
private Runnable capturer = new Runnable() {
@Override
public void run() {
capturerBuffer.rewind();
Random rand = new Random();
rand.nextBytes(capturerBuffer.array());
getAudioBus().writeCaptureData(capturerBuffer, SAMPLING_RATE);
if(capturerStarted && !audioDriverPaused) {
capturerHandler.postDelayed(capturer, capturerIntervalMillis);
}
}
};
La clase `AudioDevice` incluye otros métodos que son implementados por la clase `NoiseAudioDevice`. Sin embargo, en este ejemplo no se realiza ninguna acción relevante en dichos métodos, por lo que no se tratan en este apartado.
Paso 2: Añadir un reproductor de audio personalizado
Implementarás un renderizador de audio sencillo para el audio de las transmisiones a las que estés suscrito.
El NoiseAudioDevice() El método constructor configura un archivo para guardar el audio entrante. Esto se hace simplemente para ilustrar un uso del renderizador de audio del controlador de audio personalizado. La aplicación requiere los siguientes permisos, definidos en el AndroidManifest.xml archivo:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
El BaseAudioDevice.initRenderer() cuando la aplicación inicializa el renderizador de audio. La dirección NoiseAudioDevice La implementación de este método crea una nueva instancia del objeto `File`, en el que la aplicación escribirá los datos de audio:
@Override
public boolean initRenderer() {
rendererBuffer = ByteBuffer.allocateDirect(SAMPLING_RATE * 2); // Each sample has 2 bytes
File documentsDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
rendererFile = new File(documentsDirectory, "output.raw");
if (!rendererFile.exists()) {
try {
rendererFile.getParentFile().mkdirs();
rendererFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
El BaseAudioDevice.startRendering() se llama cuando el dispositivo de audio debe empezar a reproducir el audio de los flujos suscritos. El método NoiseAudioDevice de este método inicia el capturer hilo que se ejecutará en la cola después de 1 segundo:
@Override
public boolean startRenderer() {
rendererStarted = true;
rendererHandler.postDelayed(renderer, rendererIntervalMillis);
return true;
}
El renderer obtiene 1 segundo de audio del bus de audio llamando a la función readRenderData() método del AudioBus objeto. A continuación, escribe los datos de audio en el archivo (con fines de muestreo). Y, si el dispositivo de audio todavía se está utilizando para renderizar muestras de audio, establece un temporizador para ejecutar la función rendererHandler después de 0,1 segundos:
private Handler rendererHandler;
private Runnable renderer = new Runnable() {
@Override
public void run() {
rendererBuffer.clear();
getAudioBus().readRenderData(rendererBuffer, SAMPLING_RATE);
try {
FileOutputStream stream = new FileOutputStream(rendererFile);
stream.write(rendererBuffer.array());
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (rendererStarted && !audioDriverPaused) {
rendererHandler.postDelayed(renderer, rendererIntervalMillis);
}
}
};
Este ejemplo es deliberadamente sencillo con fines didácticos: simplemente escribe los datos de audio en un archivo. En un uso más práctico de un controlador de audio personalizado, podrías utilizarlo para reproducir audio en un dispositivo Bluetooth o para procesar el audio antes de reproducirlo.
¡Enhorabuena! Has completado el tutorial sobre controladores de audio personalizados para Android.
Puedes seguir probando y modificando el código que has creado aquí, o echar un vistazo a la Próximos pasos abajo.
Próximos pasos
Cuando hayas terminado aquí, sigue desarrollando y mejorando tu aplicación de OpenTok con estos útiles recursos:
- Conceptos básicos de la Video API: si aún no lo has hecho, dedica unos minutos a descubrir exactamente cómo funciona OpenTok
- Ejemplos de código: una recopilación de aplicaciones de ejemplo que exploran diversas funciones y casos de uso de OpenTok
- Guías para desarrolladores: documentación detallada sobre todas las características y funcionalidades de OpenTok
- Tutoriales adicionales: guías paso a paso para implementar otras funciones y casos de uso de OpenTok
- Referencia del SDK de Android: descubre los métodos y eventos asociados al SDK de OpenTok para Android