SDL中文论坛
标题:
iOS下,AssignPayloadTypesAndDefaultCodecs没有返回h264格式
[打印本页]
作者:
ancientcc
时间:
2020-10-9 09:19
标题:
iOS下,AssignPayloadTypesAndDefaultCodecs没有返回h264格式
本帖最后由 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的全过程。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3