electron打包客户端在rk3588上支持h265硬解

目录

前言

chromium是如何支持h265硬解

electron/chromium第一次编译

electron/chromium第二次编译


前言

我们的客户端程序是用electron打包的前端程序,其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的,但视频源更改为h265编码后就不能查看了,奇怪的是打包的windows客户端则可以正常查看,另外rk3588主机上的chromium浏览器也是支持播放h265编码的视频的,并且是硬件解码。经过讨论我们认为是electron编译的问题,于是我便开始研究如何重新编译electron以便在rk3588上支持h265,最终花费10天时间解决了这个问题,在此进行记录。

chromium是如何支持h265硬解

首先我想先了解下chromium是如何支持h265硬解的,于是我在rk3588主机上手动找到chromium的执行命令,并增加了日志输出,之后用chromium浏览器打开一个h265编码的视频并查看输出的日志。

/usr/lib/chromium/chromium-bin --use-gl=egl --no-sandbox --gpu-sandbox-start-early --ignore-gpu-blacklist --ignore-gpu-blocklist --enable-remote-extensions --no-default-browser-check --enable-webgpu-developer-features --enable-unsafe-webgpu --show-component-extension-options --enable-gpu-rasterization --no-default-browser-check --disable-pings --media-router=0 --enable-accelerated-video-decode --enable-features=VaapiVideoDecoder,VaapiVideoEncoder --enable-logging=stderr --vmodule=*/media/*=5

从下面的日志输出我们可以看到h265硬解码是通过系统的v4l2接口来实现的,后面经过查资料,得到了在linux系统下进行视频解码的流程大体如下:

1)先尝试进行硬解码,硬解码通过系统的vaapi接口或者v4l2接口实现。

2)硬解码不支持则调用ffmpeg进行软解码。

其中vaapi主要用在x86架构上,v4l2主要用在arm架构上;另外虽然ffmpeg支持h265软解,但谷歌因为专利原因在添加ffmpeg代码时移除了h265软解部分支持,所以chromium如果想支持h265解码,必须使用h265硬解(当然我们也可以自己修改chromium/ffmpeg部分的代码来实现软解h265)。

[3948:4041:0124/150324.813554:VERBOSE4:v4l2_device.cc(2338)] DequeueEvent(): Failed to dequeue event: 没有那个文件或目录 (2)

[3948:4041:0124/150324.814371:VERBOSE4:v4l2_device.cc(2338)] DequeueEvent(): Failed to dequeue event: 没有那个文件或目录 (2)

[3948:3948:0124/150324.818244:VERBOSE2:v4l2_video_decode_accelerator.cc(801)] Flush():

[3948:4041:0124/150324.819645:VERBOSE2:v4l2_video_decode_accelerator.cc(1628)] FlushTask():

[3948:4041:0124/150324.820190:VERBOSE4:v4l2_device.cc(2338)] DequeueEvent(): Failed to dequeue event: 没有那个文件或目录 (2)

[3948:4041:0124/150324.821289:VERBOSE2:v4l2_video_decode_accelerator.cc(956)] DecodeBufferTask(): enqueued flush buffer

[3948:4041:0124/150324.839642:VERBOSE4:v4l2_device.cc(2338)] DequeueEvent(): Failed to dequeue event: 没有那个文件或目录 (2)

[3948:4041:0124/150324.840585:VERBOSE2:v4l2_video_decode_accelerator.cc(1959)] StopOutputStream():

[3948:4041:0124/150325.337913:VERBOSE2:v4l2_video_decode_accelerator.cc(1978)] StopInputStream():

[3948:4041:0124/150325.836272:VERBOSE2:v4l2_video_decode_accelerator.cc(1715)] NotifyFlushDone(): returning flush

[3948:3948:0124/150341.327350:VERBOSE2:v4l2_video_decode_accelerator.cc(817)] Destroy():

[3948:4041:0124/150341.327903:VERBOSE2:v4l2_video_decode_accelerator.cc(1862)] DestroyTask():

[3948:4041:0124/150341.328722:VERBOSE2:v4l2_video_decode_accelerator.cc(1959)] StopOutputStream():

[3948:4041:0124/150341.328988:VERBOSE2:v4l2_video_decode_accelerator.cc(1978)] StopInputStream():

[3948:4041:0124/150341.329202:VERBOSE2:v4l2_video_decode_accelerator.cc(2497)] DestroyInputBuffers():

[3948:4041:0124/150341.331171:VERBOSE2:v4l2_video_decode_accelerator.cc(2510)] DestroyOutputBuffers():

[3948:3948:0124/150341.336184:VERBOSE2:v4l2_video_decode_accelerator.cc(838)] Destroy(): Destroyed

electron/chromium第一次编译

因为electron实际上是调用的chromium进行的视频硬解码,所以从上面了解了rk3588是通过v4l2接口实现的h265硬解之后我就开始尝试第一次编译electron了,编译步骤参考构建说明 | Electron就不再赘述了。

我发现原来electron编译时传递给chromium的默认参数是没有打开v4l2的,怪不得rk3588下不支持h265硬解,所以在编译electron时需要额外包含下面两个与v4l2相关的参数

use_v4l2_codec = true

use_v4lplugin=true

当我编完后便信心满满的让前端同事验证,结果却仍然不行。之后为了验证问题,我又用同样的参数编译了chromium,果然是无法打开,失落。

electron/chromium第二次编译

经历了上面的失败,我已经做好了梳理chromium进行视频解码的代码流程并打日志来逐步分析了,但我在解决另一个问题时看到了一位大佬给使用rk soc的系统上为chromium打的补丁,我找到了对应版本的chromium补丁后进行chromium和electron的编译,这次为了验证electron的支持,我先写了一个简单的测试程序test.js,内容如下

const { app, BrowserWindow } = require('electron');
const {execSync} = require('child_process')

app.commandLine.appendSwitch('use-gl', 'egl');

app.on('ready', () => {
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: false, // 确保安全,不加载 Node.js
        },
    });

    // 加载 chrome://gpu 页面
    win.loadURL('chrome://gpu');
});

运行后发现已经支持h265的硬解了,后面让前端同事验证,解决。

./electron test.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位,是推动医疗领域变革的核心力量。它犹如一把精准的手术刀,对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。在这一改革进程中,DR…

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…

洛谷 B2031:计算三角形面积 ← 叉积

【题目来源】 https://www.luogu.com.cn/problem/B2031 【题目描述】 平面上有一个三角形,它的三个顶点坐标分别为 (x1, y1),(x2, y2),(x3, y3),那么请问这个三角形的面积是多少。 【输入格式】 输入仅一行,包括 6 个…

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…

Kafak 单例生产者实现-C#操作

前面写了一篇入门操作的文章,因为工作需要,简单修改了下如何实现单例生产者。 Kafka入门-C#操作_c# kafka-CSDN博客文章浏览阅读1.6k次,点赞20次,收藏9次。2).报错:“kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state…

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下,服务端在校验请求参数时,若出现参数错误,要响应给客户端一个错误消息,通常我们会统一响应“参数错误”。 但是,如果只是一味的提示参数错误,我并不知道具体是哪个参数错了呀!能不能…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…

Unity git版本管理

创建仓库的时候添加了Unity的.gitignore模版,在这个时候就能自动过滤不需要的文件 打开git bash之后,步骤git版本管理-CSDN博客 如果报错,尝试重新进git 第一次传会耗时较长,之后的更新就很快了

【JWT】jwt实现HS、RS、ES、ED签名与验签

JWT 实现 HS、RS、ES 和 ED 签名与验签 签名方式算法密钥类型签名要点验签要点HSHMAC-SHA256对称密钥- 使用 crypto/hmac 和对称密钥生成 HMAC 签名- 将 header.payload 作为数据输入- 使用同一密钥重新计算 HMAC 签名- 比较计算结果与接收到的签名是否一致RSRSA-SHA256公钥 …

【Bug 记录】el-sub-menu 第一次进入默认不高亮

项目场景: 项目场景:el-sub-menu 第一次进入默认不高亮 问题描述 例如:sub-menu 的 index 后端默认传过来是 number,我们需要手动转为 string,否则会有警告,而且第一次进入 sub-menu 默认不高亮。 解决方…

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题(LLM 幻觉:现象剖析、影响与应对策略)对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符,在医疗、金融、法律等对准确性要求极高的关键领域,可能引发误导性后果&#x…

挖掘机的市场现状和发展前景:全球增长潜力,重塑基础设施建设新篇章

引言:工程机械的心脏,挖掘机的崛起之路 在现代化建设的浪潮中,挖掘机作为工程机械领域的核心设备,正以其强大的作业能力和广泛的应用场景,成为推动全球基础设施建设不可或缺的力量。从高速公路到大型矿场,…

算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪 在算法的…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有: TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例: body: Center(child: Text(开启 TextWidget 的旅程吧,珠珠, 开启 TextWidget 的旅程吧&a…

二叉树的存储(下)c++

链式存储 我们可以创建两个数组L[N]、r[N]&#xff0c;分别存储i 号结点的左右孩子的编号&#xff0c;这样就可以通过数组下标实现链式访问。 本质上还是孩子表示法&#xff0c;存储的是左右孩子的信息 #include <iostream>using namespace std;const int N 1e6 10; …

基于Docker的Kafka分布式集群

目录 1. 说明 2. 服务器规划 3. docker-compose文件 kafka{i}.yaml kafka-ui.yaml 4. kafka-ui配置集群监控 5. 参数表 6. 测试脚本 生产者-异步生产: AsyncKafkaProducer1.py 消费者-异步消费: AsyncKafkaConsumer1.py 7. 参考 1. 说明 创建一个本地开发环境所需的k…

Linux系统 C/C++编程基础——基于Qt的图形用户界面编程

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周四了&#xff0c;距离除夕只有4天了&#xff0c;各位今年卫生都搞完了吗&#xff01;&#x1f606; 本文是接着昨天Linux 系统C/C编程的知识继续讲&#xff0c;基于Qt的图形用户界面编程概念及其命令&#xff0c;后续会不断…

C++11(二)

目录 左值引用与右值引用 左值引用 右值引用 右值与左值交叉引用 移动语义 移动构造 移动赋值 完美转发 本期我们将学习C11中比较重要的一个知识点------右值引用。 左值引用与右值引用 在学习左值引用和右值引用之前&#xff0c;我们得先知道什么是左值&#xff0…

【python】四帧差法实现运动目标检测

四帧差法是一种运动目标检测技术&#xff0c;它通过比较连续四帧图像之间的差异来检测运动物体。这种方法可以在一定的程度上提高检测的准确性。 目录 1 方案 2 实践 ① 代码 ② 效果图 1 方案 具体的步骤如下&#xff1a; ① 读取视频流&#xff1a;使用cv2.VideoCapture…