iOS: как перехватывать и манипулировать байтами в AVPlayer - PullRequest
10 голосов
/ 17 марта 2019

Есть ли способ перехватить байтовые данные и выполнить операцию XOR для каждого байта перед воспроизведением звука в AVPlayer?

Я создаю приложение для потоковой передачи аудио и использую небольшой скрипт, написанный на C, для добавленияпростой слой шифрования для файлов MP3.В Android он декодируется в реальном времени следующим образом:

@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;
    }
}

Как вы можете видеть выше, отмена шифрования XOR в Android довольно проста, поскольку я использую ExoPlayer и переопределяю метод read () в его классах источника данных.Есть ли шанс выполнить то же самое, используя AVPlayer со Swift?

Вот блок-схема всей идеи:

Блок-схема шифрования AVPlayer

Спасибовы.

1 Ответ

2 голосов
/ 26 марта 2019

Для этого вы захотите использовать MTAudioProcessingTap, что является свойством AVPlayer AVAudioMix.В обратном вызове процесса крана, используйте MTAudioProcessingTapGetSourceAudio, чтобы захватить ваши буферы.Если у вас есть ссылка на буфер, вы можете сохранить данные.

Для правильной настройки AVAudioMix и MTAudioProcessingTap необходим некоторый шаблон.Пример кода, который есть у Apple, довольно старый, но все же должен работать.https://developer.apple.com/library/archive/samplecode/AudioTapProcessor/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012324

Также обратите внимание, что это будет легче сделать в Задаче C по нескольким причинам.Взаимодействие с вашим C-файлом будет легче, и это намного проще для чтения / записи в буфер в Objc.Он также будет работать быстрее, чем в быстрой.Если вам интересно посмотреть, как это будет выглядеть в swift, здесь приведен пример проекта: https://github.com/gchilds/MTAudioProcessingTap-in-Swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...