¿Hay alguna forma de interceptar datos de bytes y realizar una operación XOR en cada byte antes de reproducir audio en AVPlayer?
Estoy creando una aplicación de transmisión de audio y uso un pequeño script escrito en C para agregar una capa simple de cifrado a los archivos MP3. En Android se decodifica en tiempo real así:
@Override public int read(byte[] buffer, int offset, int readLength) throws FileDataSourceException { // ... if (readLength == 1 && offset >= 1 && offset <= 123) { buffer[offset] = (byte)(buffer[offset] ^ 11); } return bytesRead; } }Como puede ver arriba, revertir el cifrado XOR es bastante fácil en Android, ya que uso ExoPlayer y anulo el método read() en sus clases de fuente de datos. ¿Hay alguna posibilidad de hacer lo mismo usando AVPlayer con Swift?
Aquí hay un diagrama de flujo de toda la idea:
Diagrama de flujo de cifrado de AVPlayer
Gracias.
Querrá usar MTAudioProcessingTap para esto, que es una propiedad de AVPlayer de AVAudioMix . En la devolución de llamada del proceso de toque, use MTAudioProcessingTapGetSourceAudio para tomar sus búferes. Una vez que tenga su referencia de búfer, puede borrar los datos.
Se necesita algo de repetitivo para que AVAudioMix y MTAudioProcessingTap se configuren correctamente. El código de muestra que tiene Apple es bastante antiguo, pero aún debería funcionar. https://developer.apple.com/library/archive/samplecode/AudioTapProcessor/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012324
También tenga en cuenta que será más fácil hacer esto en Objective C, por varias razones. La interoperabilidad con su archivo C será más fácil, y es mucho más sencillo leer/escribir en el búfer en Objc. También se ejecutará más rápido que en Swift. Si está interesado en ver cómo se vería esto en Swift, hay un proyecto de muestra aquí: https://github.com/gchilds/MTAudioProcessingTap-in-Swift