有没有办法在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 执行相同的操作?
这是整个想法的流程图:
谢谢。
最佳答案
您需要为此使用 MTAudioProcessingTap
,这是 AVPlayer
的 AVAudioMix
的一个属性。在您的点击过程回调中,使用 MTAudioProcessingTapGetSourceAudio
获取您的缓冲区。获得缓冲区引用后,您可以对数据进行异或运算。
需要一些样板文件才能正确设置 AVAudioMix
和 MTAudioProcessingTap
。 Apple 的示例代码很旧,但仍然可以使用。
https://developer.apple.com/library/archive/samplecode/AudioTapProcessor/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012324
另请注意,出于多种原因,在 Objective C 中执行此操作会更容易。与 C 文件的互操作会更容易,并且更直接地读取/写入 Objc 中的缓冲区。它也将比 swift 运行得更快。如果你有兴趣看看它在 swift 中的样子,这里有一个示例项目: https://github.com/gchilds/MTAudioProcessingTap-in-Swift
关于iOS:如何拦截和操作 AVPlayer 中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211323/