webrtc华为手机编码异常问题

背景是有个华为手机,竖屏的时候,报错 Dropped frame, encoder queue full

找了一下原因,直接原因是数据喂给编码器之后,没有数据输出,所以outputBuilders一直是满的。
但是手机放横屏的时候,能正常编码。
我自己弄了个点对点的webrtc服务,横屏、竖屏都能正常编码。
先说结论吧,有几个方法:

方法一

检测到这种情况,回退到软编,
也就这里
修改为:
return VideoCodecStatus.FALLBACK_SOFTWARE;

方法二

offer中增加 a=extmap:4 urn:3gpp:video-orientation

方法三

降低分辨率

原理和分析

方法一就是回退到软编
方法二的细节是这样的:

Camera2Session中获取到视频的数据,在这里传递给native

@Override
public void onFrameCaptured(VideoFrame frame) {final VideoProcessor.FrameAdaptationParameters parameters =nativeAndroidVideoTrackSource.adaptFrame(frame);synchronized (videoProcessorLock) {if (videoProcessor != null) {videoProcessor.onFrameCaptured(frame, parameters);return;}}VideoFrame adaptedFrame = VideoProcessor.applyFrameAdaptationParameters(frame, parameters);if (adaptedFrame != null) {nativeAndroidVideoTrackSource.onFrameCaptured(adaptedFrame);adaptedFrame.release();}
}
};

native中这里的代码做了处理。

sdp中的urn:3gpp:video-orientation信息设置apply_rotation()的返回信息,如果有带这个信息,那么这个值是1,没有的话,是0。

if (apply_rotation() && rotation != kVideoRotation_0)buffer = buffer->ToI420();

如果这里转了一下ToI420,is_texture就为false。
在这种场景下,设置给编码器的初始化参数(720x1080)和实际的数据流(1080x720)的高宽就对应不上(保持一致是可以正常编码的)。
目前也之后一个华为的手机有问题,应该特有的兼容性问题。

其他

(上面是从java onFrameCaptured到native,这里是)从native到java编码的相关堆栈

1. VideoEncoderWrapper::Encode(webrtc::VideoFrame const&, std::__1::vector > const*) 
2. VideoEncoderSoftwareFallbackWrapper::Encode(webrtc::VideoFrame const&, std::__1::vector > const*) [video_encoder_software_fallback_wrapper.cc : 252 + 0x3]
3. VideoStreamEncoder::EncodeVideoFrame(webrtc::VideoFrame const&, long long) [video_stream_encoder.cc : 1367 + 0x3]
4. VideoStreamEncoder::MaybeEncodeVideoFrame(webrtc::VideoFrame const&, long long) [video_stream_encoder.cc : 1233 + 0xb]
5. webrtc_new_closure_impl::ClosureTask::Run() 
6. video_stream_encoder.cc : 968 + 0x7]
TaskQueueLibevent::OnWakeup(int, short, void*) [task_queue_libevent.cc : 295 + 0x3]


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部