栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

webrtc华为手机编码异常问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323178.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号