iOS: 如何拦截和操作AVPlayer中的字节

iOS: How to intercept and manipulate bytes in AVPlayer

有没有办法在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;
    }
}

正如您在上面看到的那样,在 Android 中逆向异或加密相当容易,因为我使用 ExoPlayer 并覆盖其数据源中的 read() 方法 类。 有没有机会使用带有 Swift 的 AVPlayer 执行相同的操作?

这是整个想法的流程图:

AVPlayer encryption flowchart

谢谢。

您需要为此使用 MTAudioProcessingTap,它是 AVPlayerAVAudioMix 的 属性。在您的点击过程回调中,使用 MTAudioProcessingTapGetSourceAudio 来获取您的缓冲区。获得缓冲区引用后,您可以对数据进行异或运算。

需要一些样板文件才能正确设置 AVAudioMixMTAudioProcessingTap。 Apple 的示例代码很旧,但仍然可以使用。 https://developer.apple.com/library/archive/samplecode/AudioTapProcessor/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012324

另请注意,出于多种原因,在 Objective C 中执行此操作会更容易。与您的 C 文件的互操作会更容易,并且更直接 reading/writing 到 Objc 中的缓冲区。它也将 运行 比 swift 更快。如果您有兴趣查看 swift 中的样子,这里有一个示例项目: https://github.com/gchilds/MTAudioProcessingTap-in-Swift