WebRTC:如何为视频编码器启用硬件加速

2024-01-12

我正在尝试在 WebRTC 的帮助下将屏幕捕获的视频发送到 mediasoup 。 WebRTC 库中有一个类:Android 屏幕捕捉器。 它可以工作,但在某些设备上的性能非常糟糕。特别是当我使用高清或更好的显示分辨率时。

在 stackoverflow 上我发现了一个建议 https://stackoverflow.com/questions/50914031/webrtc-cannot-record-screen打电话设置启用视频硬件加速(true) and setVideoHwAccelerationOptions()。但在较新版本的 WebRTC 库中方法已被删除 https://groups.google.com/d/msg/discuss-webrtc/SKSkOUHXB2A/uugaMVuJAgAJ .

这是我的代码:

  // ...
PeerConnectionFactory.Builder builder = PeerConnectionFactory.builder();
builder.setOptions(null);

EglBase.Context eglContext = EglUtils.getRootEglBaseContext();

VideoEncoderFactory encoderFactory =
    new DefaultVideoEncoderFactory(
        eglContext, true /* enableIntelVp8Encoder */, true);


PeerConnectionFactory.InitializationOptions initializationOptions =
PeerConnectionFactory.InitializationOptions.builder(context)
//        .setEnableVideoHwAcceleration(true)  // <-- does not work any more 
        .createInitializationOptions();
PeerConnectionFactory.initialize(initializationOptions);

mPeerConnectionFactory =
    builder
        .setVideoEncoderFactory(encoderFactory)
        .createPeerConnectionFactory();

我的问题是:如何使用较新的 WebRTC 库版本启用视频硬件加速以进行屏幕捕获。


这取决于您的设备以及您使用的 libwebrtc 版本。所以你可以检查webrtc源代码来了解HW是否支持。这意味着如果你的 libwebrtc 不在源代码中做一些工作,视频编码器的硬件加速将不受支持。 :P

因此,如果您的 libwebrtc 不支持它,那么即使您在应用程序级别的设置正确,也无法快速看到任何内容。

那么,我们来谈谈如何在libwebrtc中检查视频编码器的硬件加速。

检查这个源代码https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java https://chromium.googlesource.com/external/webrtc/+/HEAD/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java

可以在HardwareVideoEncoderFactory.java中搜索关键字:
“CurrentSdk 中是否支持硬件”

今天是 1 月 12 日,我截屏了代码。

从源代码来看,它们确实显示了清晰的信息。

顺便说一句,您还可以在 Google Play 中下载一些媒体编解码器信息应用程序来检查不同类型的 Android 手机的不同类型的编码器/解码器。那也会有帮助的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC:如何为视频编码器启用硬件加速 的相关文章

随机推荐

  • 如何避免使用 PHP cURL 进行 URL 通配?

    我有一个网址 稍作修改 如下所示 https ssl site com certificate 123 moo shoo type 456 domain GH 2fdodo 20 10 3a47 3a11 3a3316 由于括号的原因 当直
  • 实体框架始终将 DateTimeOffset 保存为 UTC

    有没有一种方法可以指示实体框架始终将 DateTimeOffset 存储为 UTC 值 从技术上讲 没有理由这样做 但如果我的数据库中的所有数据都是一致的 我更喜欢它 目前 它存储从客户端接收到的 DateTimeOffset 这可以是任何
  • 为什么 Python 中没有报告多处理错误以及如何打开报告错误?

    我设置了一些简单的代码来测试多处理的一些问题处理 但我无法跟踪此代码中的错误 因为没有来自进程的反馈 既然现在我对它视而不见 我如何才能从子流程接收异常 如何调试这段代码 coding utf 8 import multiprocessin
  • sql查询如果参数为空则选择全部

    如果以下查询可以修改为返回所有记录 一片空白 SELECT NAME SURNAME FROM MY TABLE WHERE NAME 尝试这个 SELECT FROM MY TABLE WHERE parameter IS NULL OR
  • 取消 HttpClient 请求 - 为什么 TaskCanceledException.CancellationToken.IsCancellationRequested 为 false?

    给出以下代码 var cts new CancellationTokenSource try get a hot task var task new HttpClient GetAsync http www google com cts T
  • 订阅事件日志中的非系统(自定义)事件

    每当将新日志条目添加到 Windows 事件查看器中的特定事件日志文件时 我想引发一个事件 我正在尝试做与这里提到的类似的事情 http msdn microsoft com en us library bb671202 aspx http
  • RadioGroup onCheckedChanged 函数不会触发

    我的应用程序跟踪餐厅服务员的轮班销售情况以帮助他们制定预算 在显示过去班次的活动中 我在 ListView 下创建了一个 RadioGroup 以便用户可以选择显示午餐 晚餐或两者 我已经在 RadioGroup onCheckedChan
  • 如何从 python 获取已安装的 GDAL/OGR 版本?

    如何从 python 获取已安装的 GDAL OGR 版本 我知道gdal config计划 目前正在使用以下内容 In 3 import commands In 4 commands getoutput gdal config versi
  • JavaFX 着色 TableCell

    我需要你的帮助 我有一个表 其中包含行 名称等 现在 当位于该行的对象具有特定值时 我想为特定的 tableCells 背景着色 但我只能让它读取这个单元格的值 但我需要读取对象 在我的代码中称为TableListObject 知道我需要用
  • 预测取决于 Keras 中的批量大小

    我正在尝试使用 keras 对图像进行二元分类 我的 CNN 模型在训练数据上经过了良好的训练 训练准确度约为 90 验证准确度约为 93 但是在训练过程中 如果我设置批量大小 15000 我会得到图 I 输出 如果我设置批量大小 5000
  • vkCmd* 函数的参数何时被消耗?

    一些vkCmd 函数指定何时使用或不使用某些参数 例如 在文档中vkCmdBindDescriptorSets pDynamicOffsets 的内容在期间立即被消耗 vkCmdBindDescriptorSets 的执行 但大多数人并没有
  • 在不使用命令行工具的情况下使用 Python Fabric (fab)

    尽管 Fabric 文档提到了一种使用该库进行 SSH 访问而不需要 fab 命令行工具和 或任务的方法 但我似乎无法管理一种方法来做到这一点 我想运行这个文件 示例 py 通过仅执行 python 示例 py env hosts exam
  • 支持在 Dynamics CRM 2016 中设置 Web 资源样式

    建议和支持的方式是什么来设计 CRM Web 资源的样式 使其与常规 CRM 表单 视图和对话框保持一致 想必您不会引用 CRM 正在使用的相同样式 因为这将不受支持 但是是否有一组可以直接引用的样式 以节省您自己编写的时间 它不是特定于
  • Android中如何处理ConcurrentModificationException

    我正在尝试从 a 中删除项目ArrayList 有时它弹出一个异常 java util ConcurrentModificationException 首先我尝试通过以下方式删除它们array list name remove i 但是失败
  • Fluent NHibernate 有很多外键映射问题

    我正在尝试在 nhibernate 中映射一个简单的数据结构 Tables Employees employeeID int username varchar 30 departmentID int Departments departme
  • 如何将 Spring Boot 应用程序日志文件读取到 Splunk 中? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望将日志数据从应用程序发送到 Splunk 我发现这与spring无关 只是Splunk需要一些配置来读取应用程序的日志文件 我想知道
  • 我可以将 SQL Server Management Studio 2005 用于 2008 DB 吗?

    我希望使用 Management Studio 2005 管理 SQL Server 2008 DB 原因是我们的服务器是 64 位计算机 而我们只有 64 位版本的软件 这可能吗 使用 Management Studio 2008 管理
  • 使用 stackalloc 分配的内存的初始化

    如果我分配内存stackalloc in C 内存是否已初始化 with 0 该文档没有提到这一点 只是告诉我们保留了正确的金额 在我的测试中 这种内存默认为0 但这并不意味着它是有保证的 从规格来看 18 8 堆栈分配 新分配的内存的内容
  • 如何重写WPF路由命令调度机制

    我可以以某种方式扩展 WPF 命令路由 以便它首先检查命令是否可以在聚焦字段中调用 如果不能在其他字段中调用 永远不会改变 有什么钩子吗 也许您不知道这是否可行 但在网络上的某个地方看到了类似的内容并且可以保留链接吗 抽象例子 例如 如果我
  • WebRTC:如何为视频编码器启用硬件加速

    我正在尝试在 WebRTC 的帮助下将屏幕捕获的视频发送到 mediasoup WebRTC 库中有一个类 Android 屏幕捕捉器 它可以工作 但在某些设备上的性能非常糟糕 特别是当我使用高清或更好的显示分辨率时 在 stackover