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<webrtc::VideoFrameType, std::__1::allocator<webrtc::VideoFrameType> > const*) 
2. VideoEncoderSoftwareFallbackWrapper::Encode(webrtc::VideoFrame const&, std::__1::vector<webrtc::VideoFrameType, std::__1::allocator<webrtc::VideoFrameType> > 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<webrtc::VideoStreamEncoder::OnFrame(webrtc::VideoFrame const&)::$_8>::Run() 
6. video_stream_encoder.cc : 968 + 0x7]
TaskQueueLibevent::OnWakeup(int, short, void*) [task_queue_libevent.cc : 295 + 0x3]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值