草庐IT

linux - 验证 VP8 硬件编码/解码是否真的在 Linux 上工作

coder 2023-06-19 原文

我有来自“华擎”的“ hive ”。 native 处理器为Intel Celeron N3150,支持VP8视频流硬件编解码。我想在 Google Chrome(在 Debian Linux 上)中使用此功能进行 WebRTC 调用。但我不确定如何证明 Chrome 确实在使用硬件编码/解码。

到目前为止我的发现

不幸的是,Linux 上的情况非常困惑。除了不同的加速 API(VAAPI、VDPAU 等),我不知道 Chrome 真正在使用其中的哪一个,Chrome 增加了额外的混淆,说:

视频解码:仅软件,硬件加速不可用

视频编码:硬件加速

在“ chrome://gpu ”页面上。

编码:尽管 ist 说编码已加速,但在将高清视频编码为 VP8 流时,我的 CPU 负载为 60-70%。这对我来说看起来不像硬件编码。

解码:据我在网上阅读,Linux 下的 Chrome 似乎根本不支持硬件解码。有一个名为 的 Chrome 开关--ignore-gpu-blacklist 这确实将“视频解码”行从“仅软件......”变为“硬件加速”,但这并没有改变任何东西。我还对不同的媒体播放器(如 Kodi 和 VLC)进行了一些研究。这些播放器在播放 VP8 时显示大约 25-30% 的 CPU 负载,这确实可能是硬件解码,但令人惊讶的是,当我关闭这些播放器中的硬件编码时,根本没有任何变化。这反过来又让我相信即使这些也不能在硬件中解码。

工具:我找到了一些工具,甚至来自 Intel,但其中大部分是指 GPU 负载(即 3D 加速)。我也试过 glxinfo 来自 mesa-utils 其中说:“直接渲染:是”,根据 this线程确认支持硬件解码(?)。但这只是表明支持可用,而不是当前是否有任何应用程序真正在使用它。

问题

在 Linux 上对 VP8 视频流进行编码或解码时,有没有办法清楚地验证硬件编码器和/或解码器是否正常工作?

我非常感谢您的帮助!

最佳答案

1)这里有一个更具体的标志很重要。在 Chrome://gpu ,你应该看到 VPx Video Decode:
它是说硬件还是软件?

2) 相关地,可以尝试:在 Chrome 中访问 YouTube,播放任何视频。播放时右键单击视频并选择 Stats for Nerds从上下文菜单。

这将告诉您 YouTube 是否为您提供 VP8、VP9 或 H.264。这可能是一个有用的线索,尤其是当您获得 H.264 时。 (在笔记本电脑上会更有帮助,因为如果 Chrome 和 MS Edge 一样,当笔记本电脑使用电池供电时它会停止宣传 VPx 支持,迫使 YouTube 给它 H.264,因为 VPx 比 H 消耗更多的电池.264,即使是硬件解码。H.264 是一种负担更轻的编解码器,它的硬件解码比 VPx 硬件解码更有效。Kaby Lake 可能最终会缩小差距。)

3)还有一些其他问题。 Chrome 软件渲染列表中有一些有趣的条目,表明 Chrome 可能会忽略甚至相当新的 Intel GPU,包括您的 Braswell 芯片。看看 here .请注意,其中一个条目说:“英特尔 Broadwell、Skylake 和 CherryView 上的 VPx 解码速度太慢”。

如果您关注 breadcrumb trail ,您会看到这意味着每个 gpu 都有一些特定的 PCIID 掩码(例如,N3150 应该是 0x22b1)。这只是 Windows,而且 it may也是 old bug 的残余已经修好了。

还要注意其他可能的条目,其中一些提到了特定的 Intel 驱动程序版本,以及特定的 Linux 内核版本。

4) 确保您的 Chrome://flags页面实际上表明软件渲染列表被覆盖(这是第一个标志)。您提到了命令行语法,使用旧的“黑名单”术语,但是这个标志近年来出现了一些错误,基本上不适用于某些人和其他问题。我只是仔细检查一下,无论您如何设置此标志,它实际上都会在标志页面中显示正确的设置。如果没有,显然在该页面中正确设置。请注意,有一个错误可能与您的问题有关,也可能与您的问题无关 – 覆盖软件渲染列表会翻转 chrome://gpu 中的 VPx 视频解码标志。即使在没有 VPx 硬件加速的 PC 上也可以进行硬件加速,例如我现在使用的是 Intel HD 4000 的 Ivy Bridge 笔记本电脑。我不知道这是否只是一个演示错误,Chrome 实际上并没有尝试使用硬件加速,或者 Chrome 是否真的这样做了(这似乎必须崩溃或其他什么,但事实并非如此)。

Chrome 标志是一团困惑和冲突的单词选择。该标志表示覆盖软件渲染列表。这个标志需要是 启用 ,未禁用。但如果它已启用,您将看不到“已启用”一词或任何类型的状态指示器。你会看到 这个词禁用 ,作为更改设置的邀请。只是让你知道......也许这对你来说都是旧帽子。

5) 最后一条,但非常强大的资源是 Intel Media SDK .如果默认情况下它不是免费的,它作为英特尔 IDE/C++ 编译器的学生版以及付费 IDE 版本的免费试用版的一部分是免费的。你可以在那里做很多事情来看看发生了什么。我被他们开发人员指南第 24 页中的这段话震惊了:

Hardware acceleration can be added to FFmpeg with a simple compile step. For applications written to use FFmpeg command line or libav* APIs they can then be hardware enabled by changing the codec name – for example from libx264 to h264_qsv.



我会在 ffmpeg 中为 VP8 编解码器使用该方法,看看您是否可以在 Chrome 之外的系统上触发硬件加速。

6) 另请注意,涉及视频编解码器的术语“硬件加速”在整个行业中的使用不一致,我不确定 Chrome 的确切含义(在标志中)。解码可以由 GPU 加速,也可以由固定功能单元在硬件中完全执行,该单元也恰好位于 GPU 上(但不使用 GPU 着色器)。这两者都称为硬件加速,但它们不是一回事。有时“完全在硬件中”或“固定功能”将用于区分该场景与一般 GPU 加速(有时称为部分加速或混合加速)。

official docs相当困惑,但 Braswell(就像它的前身和 Broadwell )应该有完整的 VP8 固定功能解码。而编码和 VP9(就像在 Skylake 中一样,可能具有相同的 QSV 模块)是通过混合解决方案提供的。我认为他们正在使用某种 GPU 加速(使用着色器,可能使用 OpenGL 或 OpenCL 或其他东西,但我不知道细节)。这种区别可能很重要,尤其是当您使用电池供电的设备时(更不用说 HEVC 的质量会突飞猛进)。我想这可能会证明 Chrome 开发团队关于如何使用您的 Braswell 模型的决定是合理的。不幸的是,所有这些都没有很好的记录......

关于linux - 验证 VP8 硬件编码/解码是否真的在 Linux 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35103417/

有关linux - 验证 VP8 硬件编码/解码是否真的在 Linux 上工作的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  9. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  10. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

随机推荐