|
本帖最后由 ancientcc 于 2020-10-9 09:24 编辑
调用AssignPayloadTypesAndDefaultCodecs,而不是使用webrtc内置的方法得到系统支持哪些编、解码格式时,ios下会得不到h264格式。以下是webrtc内置方法。
- bool trtc_client::InitializePeerConnection()
- {
- ...
- cricket::WebRtcVideoEncoderFactory* encoder_factory = NULL;
- cricket::WebRtcVideoDecoderFactory* decoder_factory = NULL;
- #if defined(__APPLE__) && TARGET_OS_IPHONE
- #elif defined(ANDROID)
- encoder_factory = new webrtc::jni::MediaCodecVideoEncoderFactory();
- decoder_factory = new webrtc::jni::MediaCodecVideoDecoderFactory();
- #endif
- peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
- _networkThread.get(), _workerThread.get(), signalingThread,
- nullptr,
- webrtc::CreateBuiltinAudioEncoderFactory(),
- webrtc::CreateBuiltinAudioDecoderFactory(),
- encoder_factory, decoder_factory);
- ...
- }
复制代码
当有信令服务器时,webrtc用webrtc::CreatePeerConnectionFactory创建编/解码器,我记得在这版本的webrtc,iOS的encoder_factory、decoder_factory传nullptr就行。不论是做为主叫还是被叫,都支持h264编、码解。
之后要用AssignPayloadTypesAndDefaultCodecs单独得到系统支持哪些编/解码格式,像trtspcapture、tmemcapture。要是encoder_factory传nullptr。
- encoder_factory_ = cricket::ConvertVideoEncoderFactory(std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(encoder_factory));
- std::vector<cricket::VideoCodec> recv_codecs = cricket::AssignPayloadTypesAndDefaultCodecs(encoder_factory_->GetSupportedFormats());
复制代码
此时得到的recv_codecs没有包括h264格式!
以下临时解决办法,下次升级webrtc时要仔细检查这方法。
- cricket::WebRtcVideoEncoderFactory* encoder_factory = NULL;
- cricket::WebRtcVideoDecoderFactory* decoder_factory = NULL;
- #if defined(__APPLE__) && TARGET_OS_IPHONE
- encoder_factory = webrtc::CreateObjCEncoderFactory2().release();
- decoder_factory = webrtc::CreateObjCDecoderFactory2().release();
- #elif defined(ANDROID)
- encoder_factory = new webrtc::jni::MediaCodecVideoEncoderFactory();
- decoder_factory = new webrtc::jni::MediaCodecVideoDecoderFactory();
- #endif
- <webrtc>/modules/video_coding/codecs/test/objc_codec_h264_test.mm
- std::unique_ptr<cricket::WebRtcVideoEncoderFactory> CreateObjCEncoderFactory2() {
- return rtc::MakeUnique<ObjCVideoEncoderFactory>([[RTCVideoEncoderFactoryH264 alloc] init]);
- }
- std::unique_ptr<cricket::WebRtcVideoDecoderFactory> CreateObjCDecoderFactory2() {
- return rtc::MakeUnique<ObjCVideoDecoderFactory>([[RTCVideoDecoderFactoryH264 alloc] init]);
- }
复制代码
webrtc内在机制在处理webrtc::CreatePeerConnectionFactory时,的确是能够支持h264格式,至于是不是创建了RTCVideoEncoderFactoryH264、RTCVideoDecoderFactoryH264,这不清楚。目前,没了跟踪CreatePeerConnectionFactory如何执行的测试环境,但在下次升级webrtc时,须要弄清:为什么调用CreatePeerConnectionFactory时,传encoder_factory=nullptr、decoder_factory=nullptr,依旧能得到h264。换句话说,要清楚cricket::AssignPayloadTypesAndDefaultCodecs得到recv_codecs的全过程。 |
|