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

标签 ios swift encryption avfoundation 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 文件的互操作会更容易,并且更直接地读取/写入 Objc 中的缓冲区。它也将比 swift 运行得更快。如果你有兴趣看看它在 swift 中的样子,这里有一个示例项目: https://github.com/gchilds/MTAudioProcessingTap-in-Swift

关于iOS:如何拦截和操作 AVPlayer 中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211323/

相关文章:

ios - ViewController 内的 UICollectionView

ios - AFNetworking 2.0 iOS 7 在 AFHTTPRequestOperation.h 文件中复制带有区域警告

Swift:设备横向启动时约束不正确

ios - NSArray writeFileToPath 失败

iphone - 动态 NumberOfRowsInSection

arrays - If 语句查找重复值?

ios - 这段 Swift w/SpriteKit 代码没有达到预期目的

android - 在 Android 2.3.3 上实现 TLS 1.2

java - 在 JCE 中编写加密算法

Java用PBEWithMD5AndDES算法加密