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

embedded/2025/2/1 0:17:48/

目录

前言

chromium是如何支持h265硬解

electron%2Fchromium%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%BC%96%E8%AF%91-toc" name="tableOfContents" style="margin-left:0px">electron/chromium第一次编译

electron%2Fchromium%E7%AC%AC%E4%BA%8C%E6%AC%A1%E7%BC%96%E8%AF%91-toc" name="tableOfContents" style="margin-left:0px">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%2Fchromium%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%BC%96%E8%AF%91" name="electron%2Fchromium%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%BC%96%E8%AF%91" style="margin-left:0px; margin-right:0px; text-align:justify">electron/chromium第一次编译

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

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

use_v4l2_codec = trueuse_v4lplugin=true

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

electron%2Fchromium%E7%AC%AC%E4%BA%8C%E6%AC%A1%E7%BC%96%E8%AF%91" name="electron%2Fchromium%E7%AC%AC%E4%BA%8C%E6%AC%A1%E7%BC%96%E8%AF%91" style="margin-left:0px; margin-right:0px; text-align:justify">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


http://www.ppmy.cn/embedded/158484.html

相关文章

Linux实操篇-文件目录类>/>>/echo/head/tail/ln/history

目录 传送门前言一、>、 >>概念二、>、 >>实战1. **>(输出重定向)**2. **>>(追加输出)****区别总结:** 三、echo、head、tail概念四、echo、head、tail实战1. **echo****用法**&#xff1a…

58.界面参数传递给Command C#例子 WPF例子

界面参数的传递,界面参数是如何从前台传送到后台的。 param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤: 数据绑定:界面元素(如按钮)的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时&#x…

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天,开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型,就在刚刚,凭一己之力让英伟达大跌18%,纳斯达克大跌3.7%,足足是给中国AI产…

基于java线程池和EasyExcel实现异步导出

基于java线程池和EasyExcel实现异步导出 1.controller层 GetMapping("export") public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {exportService.exportExcel(response); }2. service public void exportExcel(H…

机试题——最小矩阵宽度

题目描述 给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N,M,表示矩阵大小。 接下…

zookeeper-3.8.3-基于ACL的访问控制

ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问,类似UNIX文件权限,但无znode所有者概念,ACL指定ID及对应权限,且仅作用于特定znode,不递归。 ZooKeeper支持可插拔认证方案,ID格式为scheme…

微信小程序获取位置服务

wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…

CSS中的响应式布局初识

响应式布局是一种Web设计方法,使网站能够在各种设备(如台式电脑、平板电脑、手机等)上有良好的显示效果。响应式布局通常使用CSS媒体查询来调整页面布局以适应不同的屏幕尺寸和分辨率。下面我将通过一个简单的示例来讲解如何实现响应式布局。…