WebRTC native改变默认Video编解码器顺序

680 阅读1分钟

背景

WebRTC目前支持VP8、VP9、H264、AV1的video编解码器,如果在建立P2P连接之前不改变编解码器顺序,那么VP8总是排在最前面,也就是优先级最高,如果对端也支持VP8,那么VP8将会被选作你们之前视频传输的编解码器

改变Video编解码器顺序

void SRTCPeerConnectionImpl::ChangeVideoCodecPreferences(
    const std::string& mimeType) {
  RTC_DCHECK(_peerConnectionFactory);
  
  auto codecs = _peerConnectionFactory->GetRtpSenderCapabilities(
      cricket::MediaType::MEDIA_TYPE_VIDEO).codecs;
  std::vector<webrtc::RtpCodecCapability> newCodecs;
  for (auto iter = codecs.begin(); iter != codecs.end();) {
    if (iter->mime_type() == mimeType) {
      newCodecs.push_back(*iter);
      iter = codecs.erase(iter);
    } else {
      ++iter;
    }
  }

  newCodecs.insert(newCodecs.end(), codecs.begin(), codecs.end());
  auto transceivers = _peerConnection->GetTransceivers();

  for (auto& transceiver : transceivers) {
    if (transceiver->media_type() == cricket::MediaType::MEDIA_TYPE_VIDEO) {
      transceiver->SetCodecPreferences(newCodecs);
    }
  }

}

上面的代码就是将传入的mimeType放置到首位,注意这个函数的调用要在CreatOffer之前,其中mimeType可以是以下值:

  • video/H264
  • video/VP8
  • video/VP9
  • video/AV1X