webrtc添加端到端加密函数的方法:
一:实现自己的加密类。
继承接口:
class HCCrypto :public webrtc::FrameEncryptorInterface {
public:
void AddRef() const;
int Encrypt(cricket::MediaType media_type,
uint32_t ssrc,
rtc::ArrayView<const uint8_t> additional_data,
rtc::ArrayView<const uint8_t> frame,
rtc::ArrayView<uint8_t> encrypted_frame,
size_t* bytes_written) ;
size_t GetMaxCiphertextByteSize(cricket::MediaType media_type,
size_t frame_size);
rtc::RefCountReleaseStatus Release() const ;
};
二.添加到对应的senders
auto senders = peer_connection_->GetSenders();
for(auto sender: senders ){
rtc::scoped_refptr<HCCrypto> frame_encryptor( new HCCrypto());
// sender->
sender->SetFrameEncryptor(frame_encryptor);
}
ps:注意添加的时机。需要是在添加完track之后 要不然 。代码里面有判断加入不进去。
void RtpSenderBase::SetFrameEncryptor(
rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
frame_encryptor_ = std::move(frame_encryptor);
// Special Case: Set the frame encryptor to any value on any existing channel.
if (media_channel_ && ssrc_ && !stopped_) {
worker_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
media_channel_->SetFrameEncryptor(ssrc_, frame_encryptor_);
});
}
}
三。注意看头文件的注释.非常重要.
// FrameEncryptorInterface allows users to provide a custom encryption
// implementation to encrypt all outgoing audio and video frames. The user must
// also provide a FrameDecryptorInterface to be able to decrypt the frames on
// the receiving device. Note this is an additional layer of encryption in
// addition to the standard SRTP mechanism and is not intended to be used
// without it. Implementations of this interface will have the same lifetime as
// the RTPSenders it is attached to. Additional data may be null.
// Note: This interface is not ready for production use.
class FrameEncryptorInterface : public rtc::RefCountInterface {
public:
~FrameEncryptorInterface() override {}
// Attempts to encrypt the provided frame. You may assume the encrypted_frame
// will match the size returned by GetMaxCiphertextByteSize for a give frame.
// You may assume that the frames will arrive in order if SRTP is enabled.
// The ssrc will simply identify which stream the frame is travelling on. You
// must set bytes_written to the number of bytes you wrote in the
// encrypted_frame. 0 must be returned if successful all other numbers can be
// selected by the implementer to represent error codes.
virtual int Encrypt(cricket::MediaType media_type,
uint32_t ssrc,
rtc::ArrayView<const uint8_t> additional_data,
rtc::ArrayView<const uint8_t> frame,
rtc::ArrayView<uint8_t> encrypted_frame,
size_t* bytes_written) = 0;
// Returns the total required length in bytes for the output of the
// encryption. This can be larger than the actual number of bytes you need but
// must never be smaller as it informs the size of the encrypted_frame buffer.
virtual size_t GetMaxCiphertextByteSize(cricket::MediaType media_type,
size_t frame_size) = 0;
};
ps:修改webrtc的代码测试是否添加成功.
rtc::Buffer encrypted_video_payload;
if (frame_encryptor_ != nullptr) {
std::cout<<"++++++++++有加密++++++++++++++++++"<<std::endl;
下次把国密加密添加进来.