音频加解密
音频加密和解密
加密音频数据
在 QNLocalAudioPacketCallback#onSetMaxEncryptSize
中先根据加密的方式,告知 SDK 加密后数据的最大空间大小;
然后在 QNLocalAudioPacketCallback#onEncrypt
自定义加密
mEngine.setLocalAudioPacketCallback(mLocalAudioTrack, new QNLocalAudioPacketCallback() {
@Override
public int onPutExtraData(ByteBuffer extraData, int extraDataMaxSize) {
return 0;
}
@Override
public int onSetMaxEncryptSize(int frameSize) {
// 当需要根据自己的算法加密音频数据时,需要在该方法告知 SDK 加密后的最大数据大小
return frameSize + 10;
}
@Override
public int onEncrypt(ByteBuffer frame, int frameSize, ByteBuffer encryptedFrame) {
// 自主加密接口,将加密后的数据放置到 encryptedFrame 中,并返回加密后大小
encryptedFrame.rewind();
frame.rewind();
encryptedFrame.put((byte) 0x18);
encryptedFrame.put((byte) 0x19);
encryptedFrame.put(frame);
encryptedFrame.flip();
return encryptedFrame.remaining();
}
});
解密音频数据
在 QNRemoteAudioPacketCallback#onSetMaxDecryptSize
中先根据解密的方式,告知 SDK 解密后数据的最大空间大小;
然后在 QNRemoteAudioPacketCallback#onDecrypt
自定义解密
mEngine.setRemoteAudioPacketCallback(info, new QNRemoteAudioPacketCallback() {
@Override
public void onGetExtraData(ByteBuffer extraData, int extraDataSize) {
}
@Override
public int onSetMaxDecryptSize(int encryptedFrameSize) {
// 当需要根据自己的算法解密音频数据时,需要在该方法告知 SDK 解密后的最大数据大小
return encryptedFrameSize;
}
@Override
public int onDecrypt(ByteBuffer encryptedFrame, int encryptedSize, ByteBuffer frame) {
// 自主解密接口,将解密后的数据放置到 frame 中,并返回解密后大小
encryptedFrame.rewind();
frame.rewind();
if (encryptedFrame.get(0) == 0x18 && encryptedFrame.get(1) == 0x19) {
encryptedFrame.position(2);
frame.put(encryptedFrame);
return encryptedSize - 2;
}
}
});
音频传输和接收自定义数据
添加自定义数据
在回调 QNLocalAudioPacketCallback#onPutExtraData
中放置自定义数据,SDK 将携带该数据传输
mQNRTCEngine.setLocalAudioPacketCallback(item, new QNLocalAudioPacketCallback() {
@Override
public int onPutExtraData(ByteBuffer extraData, int extraDataMaxSize) {
/// 放置自定义数据并返回数据大小
extraData.rewind();
extraData.put((byte) 0x11);
extraData.put((byte) 0x12);
extraData.flip();
return extraData.remaining();
}
@Override
public int onSetMaxEncryptSize(int frameSize) {
return 0;
}
@Override
public int onEncrypt(ByteBuffer frame, int frameSize, ByteBuffer encryptedFrame) {
return 0;
}
});
接收自定义数据
在回调 QNLocalAudioPacketCallback#onGetExtraData
使用 SDK 解析后的自定义数据
mQNRTCEngine.setRemoteAudioPacketCallback(trackInfo, new QNRemoteAudioPacketCallback() {
@Override
public void onGetExtraData(ByteBuffer extraData, int extraDataSize) {
// 根据 extraDataSize 使用 extraData 中的数据
if (extraDataSize > 0) {
}
}
@Override
public int onSetMaxDecryptSize(int encryptedFrameSize) {
return 0;
}
@Override
public int onDecrypt(ByteBuffer encryptedFrame, int encryptedSize, ByteBuffer frame) {
return 0;
}
});
注意事项
- 传输自定义数据,由七牛内部标示传输并在接收时解析,可以兼容服务转推和合流
- 音频加解密,由客户自定义加密传输并接收解密,不支持同时使用服务转推和合流