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

时间:2019-03-17 20:00:21

标签: ios swift encryption avfoundation avplayer

有没有办法在AVPlayer中播放音频之前截取字节数据并对每个字节执行XOR操作?

我正在构建一个音频流应用程序,并使用一个用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中反转XOR加密非常容易,因为我使用ExoPlayer并在其数据源类中覆盖read()方法。 可以在Swift中使用AVPlayer来执行相同的事情吗?

这是整个想法的流程图:

AVPlayer encryption flowchart

谢谢。

1 个答案:

答案 0 :(得分:2)

您将为此使用MTAudioProcessingTap,这是AVPlayer的{​​{1}}的属性。在点击过程回调中,使用AVAudioMix获取缓冲区。一旦有了缓冲区引用,就可以对数据进行异或。

要正确设置MTAudioProcessingTapGetSourceAudioAVAudioMix,需要一些样板。苹果公司拥有的示例代码已经很老了,但仍然可以使用。 https://developer.apple.com/library/archive/samplecode/AudioTapProcessor/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012324

还要注意,出于多种原因,在目标C中执行此操作会更容易。与C文件的互操作将更容易,并且对Objc中的缓冲区的读/写更加直接。它还将比快速运行更快。如果您想快速了解一下,这里有一个示例项目: https://github.com/gchilds/MTAudioProcessingTap-in-Swift