SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3401|回复: 0
打印 上一主题 下一主题

[webrtc] iOS下,AssignPayloadTypesAndDefaultCodecs没有返回h264格式

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2020-10-9 09:19:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2020-10-9 09:24 编辑

调用AssignPayloadTypesAndDefaultCodecs,而不是使用webrtc内置的方法得到系统支持哪些编、解码格式时,ios下会得不到h264格式。以下是webrtc内置方法。
  1. bool trtc_client::InitializePeerConnection()
  2. {
  3.   ...
  4.   cricket::WebRtcVideoEncoderFactory* encoder_factory = NULL;
  5.   cricket::WebRtcVideoDecoderFactory* decoder_factory = NULL;
  6. #if defined(__APPLE__) && TARGET_OS_IPHONE

  7. #elif defined(ANDROID)
  8.   encoder_factory = new webrtc::jni::MediaCodecVideoEncoderFactory();
  9.   decoder_factory = new webrtc::jni::MediaCodecVideoDecoderFactory();
  10. #endif

  11.   peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
  12.         _networkThread.get(), _workerThread.get(), signalingThread,
  13.         nullptr,
  14.                 webrtc::CreateBuiltinAudioEncoderFactory(),
  15.                 webrtc::CreateBuiltinAudioDecoderFactory(),
  16.                 encoder_factory, decoder_factory);
  17.   ...
  18. }
复制代码

当有信令服务器时,webrtc用webrtc::CreatePeerConnectionFactory创建编/解码器,我记得在这版本的webrtc,iOS的encoder_factory、decoder_factory传nullptr就行。不论是做为主叫还是被叫,都支持h264编、码解。

之后要用AssignPayloadTypesAndDefaultCodecs单独得到系统支持哪些编/解码格式,像trtspcapture、tmemcapture。要是encoder_factory传nullptr。
  1. encoder_factory_ = cricket::ConvertVideoEncoderFactory(std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(encoder_factory));
  2. std::vector<cricket::VideoCodec> recv_codecs = cricket::AssignPayloadTypesAndDefaultCodecs(encoder_factory_->GetSupportedFormats());
复制代码

此时得到的recv_codecs没有包括h264格式!

以下临时解决办法,下次升级webrtc时要仔细检查这方法。
  1.   cricket::WebRtcVideoEncoderFactory* encoder_factory = NULL;
  2.   cricket::WebRtcVideoDecoderFactory* decoder_factory = NULL;

  3. #if defined(__APPLE__) && TARGET_OS_IPHONE
  4.   encoder_factory = webrtc::CreateObjCEncoderFactory2().release();
  5.   decoder_factory = webrtc::CreateObjCDecoderFactory2().release();
  6. #elif defined(ANDROID)
  7.   encoder_factory = new webrtc::jni::MediaCodecVideoEncoderFactory();
  8.   decoder_factory = new webrtc::jni::MediaCodecVideoDecoderFactory();
  9. #endif

  10. <webrtc>/modules/video_coding/codecs/test/objc_codec_h264_test.mm
  11. std::unique_ptr<cricket::WebRtcVideoEncoderFactory> CreateObjCEncoderFactory2() {
  12.   return rtc::MakeUnique<ObjCVideoEncoderFactory>([[RTCVideoEncoderFactoryH264 alloc] init]);
  13. }

  14. std::unique_ptr<cricket::WebRtcVideoDecoderFactory> CreateObjCDecoderFactory2() {
  15.   return rtc::MakeUnique<ObjCVideoDecoderFactory>([[RTCVideoDecoderFactoryH264 alloc] init]);
  16. }
复制代码

webrtc内在机制在处理webrtc::CreatePeerConnectionFactory时,的确是能够支持h264格式,至于是不是创建了RTCVideoEncoderFactoryH264、RTCVideoDecoderFactoryH264,这不清楚。目前,没了跟踪CreatePeerConnectionFactory如何执行的测试环境,但在下次升级webrtc时,须要弄清:为什么调用CreatePeerConnectionFactory时,传encoder_factory=nullptr、decoder_factory=nullptr,依旧能得到h264。换句话说,要清楚cricket::AssignPayloadTypesAndDefaultCodecs得到recv_codecs的全过程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 01:30 , Processed in 0.078869 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表