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 = trueuse_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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66978.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是網絡爬蟲?Python爬蟲到底怎么學?

最近我在研究 Python 網絡爬蟲,發現這玩意兒真是有趣,干脆和大家聊聊我的心得吧!咱們都知道,網絡上的信息多得就像大海里的水,而網絡爬蟲就像一個勤勞的小礦工,能幫我們從這片浩瀚的信息海洋中挖掘出需要的…

【Jave全棧】Java與JavaScript比較

文章目錄 前言一、Java1、 歷史與背景2、語言特點3、應用場景4、生態系統 二、JavaScript1、歷史與背景2、語言特點3、應用場景4、 生態系統 三、相同點四、不同點1、語言類型2、用途3、語法和結構4、性能5、生態系統6、開發模式 前言 Java和JavaScript是兩種不同的編程語言&a…

GitCode 助力 AutoTable:共創 MyBatis 生態的自動表格管理新篇章

項目倉庫https://gitcode.com/dromara/auto-table 解放雙手,專注業務:MyBatis 生態的“自動表格”創新 AutoTable 是一款致力于為 MyBatis 生態賦予“自動表格”功能的創新插件。其核心理念是通過 Java 實體類自動生成和維護數據庫的表結構&#xff0c…

【MCU】DFU、IAP、OTA

我發現很多人把幾個概念都學混了,只記得一個升級了 DFU DFU (device firmware update)是指的 USB DFU,這個是 USB 的一個機制,可以升級設備的固件,可以去 USB-IF 查看規范文件。 OTA 全稱為 Over-the-air update,利…

ThinkPHP 8 操作JSON數據

【圖書介紹】《ThinkPHP 8高效構建Web應用》-CSDN博客 《2025新書 ThinkPHP 8高效構建Web應用 編程與應用開發叢書 夏磊 清華大學出版社教材書籍 9787302678236 ThinkPHP 8高效構建Web應用》【摘要 書評 試讀】- 京東圖書 使用VS Code開發ThinkPHP項目-CSDN博客 編程與應用開…

GD32F303 GCC 環境搭建

一、引言 在嵌入式開發領域,GD32F303 微控制器以其出色的性能和豐富的功能被廣泛應用。為了充分發揮其潛力,搭建一個高效的開發環境并深入理解項目構建過程至關重要。本文將詳細介紹如何基于 GCC 工具鏈搭建 GD32F303 的開發環境,重點聚焦于…

【C++】詳細講解繼承(下)

本篇來繼續說說繼承。上篇可移步至【C】詳細講解繼承(上) 1.繼承與友元 友元關系不能繼承 ,也就是說基類友元不能訪問派?類私有和保護成員。 class Student;//前置聲明class Same //基類 { public:friend void Fun(const Same& p, con…

考研機試題:今年的第幾天

描述 輸入年、月、日&#xff0c;計算該天是本年的第幾天。 輸入描述: 包括三個整數年(1<Y<3000)、月(1<M<12)、日(1<D<31)。 輸出描述: 輸入可能有多組測試數據&#xff0c;對于每一組測試數據&#xff0c; 輸出一個整數&#xff0c;代表Input中的年、…

解鎖羅技鍵盤新技能:輕松鎖定功能鍵(羅技K580)

在使用羅技鍵盤的過程中&#xff0c;你是否曾因 F11、F12 功能鍵的默認設置與實際需求不符而感到困擾&#xff1f; 別擔心&#xff0c;今天就為大家分享一個簡單實用的小技巧 —— 鎖定羅技鍵盤的 F11、F12 功能鍵&#xff0c;讓你的操作更加得心應手&#xff01; 通常情況下…

Flink把kafa數據寫入Doris的N種方法及對比。

用Flink+Doris來開發實時數倉,首要解決是如何接入kafka實時流,下面是參考Doris官方文檔和代碼,在自己項目開發的實踐中總結,包括一些容易踩坑的細節。 目錄 Routine Load方法 接入kafka實時數據 踩坑的問題細節 Flink Doris Connector方法 完整示例 Routine Load方法…

小識JVM堆內存管理的優化機制TLAB

JVM&#xff08;Java虛擬機&#xff09;在堆內存分配空間時&#xff0c;TLAB&#xff08;Thread Local Allocation Buffer&#xff0c;線程本地分配緩存區&#xff09;是一種重要的內存管理優化技術。以下是對TLAB的詳細解釋&#xff1a; 一、TLAB的定義 TLAB是JVM堆內存管理…

(開源)基于Django+Yolov8+Tensorflow的智能鳥類識別平臺

1 項目簡介&#xff08;開源地址在文章結尾&#xff09; 系統旨在為了幫助鳥類愛好者、學者、動物保護協會等群體更好的了解和保護鳥類動物。用戶群體可以通過平臺采集野外鳥類的保護動物照片和視頻&#xff0c;甄別分類、實況分析鳥類保護動物&#xff0c;與全世界各地的用戶&…

【力扣Hot 100】普通數組2

3. 輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k **個位置&#xff0c;其中 k **是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出:[5,6,7,1,2,3,4]解釋: 向右輪轉 1 步:[7,1,2,3,4,5,6] 向右輪轉 2 步:[6,7,1,2,3,4,5] 向右輪轉 3 步:[…

專題三_窮舉vs暴搜vs深搜vs回溯vs剪枝_全排列

dfs解決 全排列&子集 1.全排列 link:46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 全局變量回溯 code class Solution { public:vector<vector<int>> ans;vector<int> cur;vector<bool> used;vector<vector<int>> permute…

2_高并發內存池_各層級的框架設計及ThreadCache(線程緩存)申請內存設計

一、高并發內存池框架設計 高并發池框架設計&#xff0c;特別是針對內存池的設計&#xff0c;需要充分考慮多線程環境下&#xff1a; 性能問題鎖競爭問題內存碎片問題 高并發內存池的整體框架設計旨在提高內存的申請和釋放效率&#xff0c;減少鎖競爭和內存碎片。 高并發內存…

JAVA 使用反射比較對象屬性的變化,記錄修改日志。使用注解【策略模式】,來進行不同屬性枚舉值到中英文描述的切換,支持前端國際化。

1.首先定義一個接口&#xff0c;接口中有兩個方法&#xff0c;分別是將屬性轉換成英文描述和中文描述。 其實就是將數據庫中記錄的 0 1 &#xff0c;轉換成后面的描述 這邊定義了中文轉換為默認方法&#xff0c;是因為有些屬性不需要進行中文轉換&#xff0c;或者該屬性的枚舉…

webrtc入門系列(五)amazon-kinesis-video-streams-webrtc-sdk-c編譯

《webrtc入門系列&#xff08;一&#xff09;easy_webrtc_server 入門環境搭建》 《webrtc入門系列&#xff08;二&#xff09;easy_webrtc_server 入門example測試》 《webrtc入門系列&#xff08;三&#xff09;云服務器coturn環境搭建》 《webrtc入門系列&#xff08;四&…

AIGC大模型詳解(ChatGPT,Cursor,豆包,文心一格)

定義與概念 AIGC&#xff08;AI Generated Content&#xff09;大模型是基于人工智能技術&#xff0c;具有海量參數、強大算力支持&#xff0c;能處理和生成多種類型內容的深度學習模型。可自主學習數據中的模式和規律&#xff0c;生成文本、圖像、音頻等內容&#xff0c;如Ch…

.NET9增強OpenAPI規范,不再內置swagger

ASP.NETCore in .NET 9.0 OpenAPI官方文檔ASP.NET Core API 應用中的 OpenAPI 支持概述 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/openapi/overview?viewaspnetcore-9.0https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/ope…

第38周:貓狗識別 (Tensorflow實戰第八周)

目錄 前言 一、前期工作 1.1 設置GPU 1.2 導入數據 輸出 二、數據預處理 2.1 加載數據 2.2 再次檢查數據 2.3 配置數據集 2.4 可視化數據 三、構建VGG-16網絡 3.1 VGG-16網絡介紹 3.2 搭建VGG-16模型 四、編譯 五、訓練模型 六、模型評估 七、預測 總結 前言…