HelloGitHub 分享 GitHub 上有趣、入門級的開源項(xiàng)目。
站在用戶的角度思考問題,與客戶深入溝通,找到瀾滄網(wǎng)站設(shè)計(jì)與瀾滄網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瀾滄地區(qū)。
這里有實(shí)戰(zhàn)項(xiàng)目、入門教程、黑 科技 、開源書籍、大廠開源項(xiàng)目等,涵蓋多種編程語言 Python、Java、Go、C/C++、Swift...讓你在短時(shí)間內(nèi)感受到開源的魅力,對編程產(chǎn)生興趣!
1、 toybox :該項(xiàng)目將 200 多個(gè)常用的 Linux 命令行工具,做成一個(gè)可執(zhí)行文件。從而可以讓 Android 這種原本不支持 Linux 命令的系統(tǒng),也得以用上 ls、find、ps 等命令。還可以用于快速構(gòu)建最小的 Linux 環(huán)境
2、 the_silver_searcher :比 ack 更快的命令行搜索工具。速度快、功能強(qiáng)大、使用簡單,支持 Linux、Windows、macOS 操作系統(tǒng),還能夠整合進(jìn) Vim 和 Emacs 等編輯器
3、 WindTerm :支持 SSH/Telnet/Serial/Shell/Sftp 的終端工具。雖然該軟件完全免費(fèi),但部分代碼尚未完全開源,對安全敏感的同學(xué)可以再觀望下
4、 wavefunctioncollapse :基于波函數(shù)坍縮 (WFC) 算法,實(shí)現(xiàn)的無限城市示例。城市里有房子、樓梯、樹木、連接房屋的通道,你可以在城市中自由移動(dòng)、跳躍、飛行,但不論你怎么移動(dòng)都找不到盡頭,因?yàn)檫@座城市會(huì)無限延伸
5、 NETworkManager :管理和解決網(wǎng)絡(luò)問題的工具。它集成了 IP 和端口掃描、WiFi 分析器、跟蹤路由、DNS 查詢等工具
6、 ppsspp :能夠運(yùn)行在 Android 和 PC 上的開源 PSP 模擬器
7、 leocad :用來創(chuàng)建虛擬樂高模型的 CAD 工具。適用于 Windows、Linux 和 macOS 系統(tǒng)
8、 csshake :用 CSS 實(shí)現(xiàn)抖動(dòng)效果
9、 MangoDB :真正開源的 MongoDB 替代品。它底層采用 PostgreSQL 作為存儲(chǔ)引擎,用 Go 語言實(shí)現(xiàn)了 MongoDB 協(xié)議,所以幾乎兼容所有的 MongoDB 庫,遷移起來毫無負(fù)擔(dān)。如果你用不到 MongoDB 的高級功能,還受限于它的開源協(xié)議,那么這個(gè)項(xiàng)目可作為 MongoDB 的開源替代方案。它才剛剛起步,建議觀望一段時(shí)間或做足測試再用于生產(chǎn)環(huán)境
10、 caddy :用 Go 編寫的輕量級 Web 服務(wù)器。它相較于 Apache、Nginx 這些知名 Web 服務(wù)器,獨(dú)特點(diǎn)在于提供了編譯好的可執(zhí)行文件,實(shí)現(xiàn)了真正的開箱即用。無需任何配置即可擁有免費(fèi)的 HTTPS、自動(dòng)把 Markdown 文件轉(zhuǎn)化成 HTML 等人性化的功能。如果是搭建中小型的 Web 服務(wù),它完全夠用而且省時(shí)省心
11、 croc :可以讓任意兩臺(tái)計(jì)算機(jī),安全方便地傳輸文件和文件夾的工具。輕松實(shí)現(xiàn)端到端加密的跨平臺(tái)文件傳輸,還支持多文件傳輸、傳輸中斷和恢復(fù)等功能
12、 jnativehook :獲取鍵盤和鼠標(biāo)事件的 Java 庫。輕松監(jiān)聽按鍵、鼠標(biāo)移動(dòng)、點(diǎn)擊等事件
13、 spider-flow :用流程圖的方式編寫爬蟲的平臺(tái)。無需寫代碼就可以快速完成一個(gè)簡單的爬蟲
14、 greenDAO :高性能的 Android ORM 庫。擁有體積小、易于使用、支持?jǐn)?shù)據(jù)庫加密等特點(diǎn),通過它 Android 開發(fā)者可以采用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫,不需要再手寫和拼接 SQL 啦
15、 vue-color-avatar :純前端實(shí)現(xiàn)的矢量風(fēng)格頭像生成網(wǎng)站。可以通過搭配不同的素材,生成個(gè)性化頭像。該項(xiàng)目使用 Vite + Vue3 開發(fā),能夠幫助前端初學(xué)者熟悉 Vue3 語法并掌握項(xiàng)目搭建的相關(guān)知識(shí)
16、 colorfu :自動(dòng)生成由文字/顏色/圖片/紋理元素組成的壁紙
17、 pm2 :Node.js 的進(jìn)程管理工具。它容易上手操作簡單,可以有效地提高 Node.js 程序運(yùn)行的穩(wěn)定性,支持自動(dòng)重啟、負(fù)載均衡、不停服務(wù)重啟、性能監(jiān)控等功能,多用于生產(chǎn)環(huán)境中管理、監(jiān)控 Node.js 進(jìn)程
18、 automa :通過圖形化界面拖拽功能模塊,實(shí)現(xiàn)瀏覽器自動(dòng)操作的擴(kuò)展工具。輕松實(shí)現(xiàn)自動(dòng)填表、截圖、定時(shí)執(zhí)行等操作。讓瀏覽器自動(dòng)完成預(yù)設(shè)工作流的插件,從而減少重復(fù)性操作提高效率
19、 PyWebIO :快速構(gòu)建 Web 應(yīng)用的 Python 工具。通過該項(xiàng)目你可在不寫 HTML、CSS、JS 代碼的前提下,僅用 Python 快速完成一個(gè)包含數(shù)據(jù)展示、表單的小型 Web 應(yīng)用頁面
20、 pottery :以 Python 的方式操作 Redis 的庫。忘記那些 Redis 命令吧,只要你知道如何使用 Python 字典,那么你就會(huì)用這個(gè)庫操作 Redis
21、 zulip :完全開源的企業(yè)級即時(shí)通訊項(xiàng)目。后端采用 Python 語言實(shí)現(xiàn)性能足夠強(qiáng)大,功能齊全相當(dāng)于開源、免費(fèi)的 Slack,擁有拖拽上傳文件、代碼高亮、Markdown 語法、應(yīng)用整合、容易接入的 API 等功能,還支持 Web、PC、iOS 和 Android 主流平臺(tái),眾多知名企業(yè)都在用,能夠有效地提高團(tuán)隊(duì)溝通和辦公效率。同時(shí)該項(xiàng)目對新手用戶友好,如果你想加入一個(gè)不錯(cuò)的 Python 開源項(xiàng)目,推薦你花時(shí)間研究下它一定會(huì)有所收獲
22、 webssh :簡單的 SSH 連接服務(wù)器的 Python Web 應(yīng)用。該項(xiàng)目后端采用 Tornado Web 框架和 Python SSH 庫 paramiko,前端是 TypeScript 寫的命令行前端組件 Xterm.js 實(shí)現(xiàn)。整個(gè)項(xiàng)目簡單還具有實(shí)用價(jià)值,可作為 Python Web 的實(shí)戰(zhàn)項(xiàng)目學(xué)習(xí)
23、 django-debug-toolbar :Django 的調(diào)試工具欄??娠@示當(dāng)前請求和響應(yīng)有關(guān)的各種調(diào)試信息,包括耗時(shí)、SQL、配置、性能等信息
24、 hyperfine :命令行基準(zhǔn)測試工具??捎脕聿榭春蛯Ρ让畹暮臅r(shí),支持多次運(yùn)行的統(tǒng)計(jì)分析、結(jié)果導(dǎo)出等功能
25、 xcode-dev-cleaner :用于清理各種 Xcode 的緩存數(shù)據(jù),釋放存儲(chǔ)空間。注意是清除 Xcode 緩存數(shù)據(jù),不是卸載 Xcode 哈
26、 toml :更易讀和易于維護(hù)的配置文件格式。如果你厭倦了 INI 的局限性、層層嵌套的 JSON 和 YAML 令人心驚膽戰(zhàn)的縮進(jìn)語法,不防給 TOML 一個(gè)機(jī)會(huì),它支持多種數(shù)據(jù)類型、拋棄了縮進(jìn)和嵌套,而且眾多流行編程語言都有對應(yīng)的庫。TOML 已經(jīng)足夠成熟,絕對值得一試
27、 waka-readme-stats :自動(dòng)在 GitHub 個(gè)人首頁展示編程時(shí)長的工具。該項(xiàng)目通過 WakaTime 記錄用戶在 IDE 的使用時(shí)間,統(tǒng)計(jì)編程時(shí)長和數(shù)據(jù),然后采用 GitHub Action 自動(dòng)獲取并動(dòng)態(tài)更新到 GitHub 個(gè)人首頁。輕而易舉地展示自己的編程時(shí)長
28、 PathPlanning :常見的路徑規(guī)劃算法集合。項(xiàng)目包含了 Python 代碼實(shí)現(xiàn)、運(yùn)行過程動(dòng)畫以及相關(guān)論文
29、 howdy :為 Linux 系統(tǒng)提供人臉識(shí)別解鎖電腦的工具。通過電腦內(nèi)置的攝像頭和紅外設(shè)備,實(shí)現(xiàn)了類似 Windows Hello 風(fēng)格的身份認(rèn)證,可用于登陸、鎖屏、sudo 等任何需要輸入密碼的地方
30、 The-Open-Book :開源的電子水墨屏閱讀設(shè)備。動(dòng)手能力強(qiáng)的同學(xué)可跟著這個(gè)項(xiàng)目,從焊電路板開始親手制作出一個(gè)類 Kindle 的 4.2 英寸閱讀設(shè)備
31、 fl_chart :Flutter 圖表庫。它支持折線圖、條形圖、餅圖、散點(diǎn)圖和雷達(dá)圖
32、 ugo-compiler-book :《從頭開發(fā)一個(gè)迷你 Go 語言》該書教你從頭實(shí)現(xiàn)迷你 Go 語言,內(nèi)容包含了詞法解析、語法樹構(gòu)建、函數(shù)閉包、接口、CGO 的實(shí)現(xiàn)等內(nèi)容
33、 archbase :教科書《計(jì)算機(jī)體系結(jié)構(gòu)基礎(chǔ)》第三版
34、 spring-in-action-v6-translate :《Spring 實(shí)戰(zhàn)第 6 版》中文翻譯
35、 best_AI_papers_2021 :2021 年必看的人工智能論文列表。該項(xiàng)目不是簡單的羅列論文,它不僅包含相關(guān)論文的代碼、效果展示,還有深入的文章和講解視頻。通過學(xué)習(xí)這些前沿的人工智能論文,提前了解 AI 在未來更多可能性
36、 AnimeGANv2 :可以將圖片和視頻轉(zhuǎn)換成漫畫風(fēng)格的工具。采用的是神經(jīng)風(fēng)格遷移+生成對抗網(wǎng)絡(luò)(GAN)的組合,轉(zhuǎn)換速度快
感謝您的閱讀,如果覺得內(nèi)容還不錯(cuò)的話 求贊、求分享 ,您的每一次支持都將讓 HelloGitHub 變得更好!
一、前言
Flutter開發(fā),就需要對各種狀態(tài)的管理,就是在請求數(shù)據(jù)的時(shí)候需要實(shí)時(shí)變化,各種交互變化等,在沒有使用GetX之前使用Provider,用Provider的時(shí)候覺得真香,挺方便的,需要刷新的時(shí)候直接 notifyListeners(); 用了GetX之后覺得Provider太繁瑣了。這邊介紹下GetX的使用以及常用的方法。
二、 GetX
GetX 是 Flutter 上的一個(gè)輕量且強(qiáng)大的解決方案:高性能的狀態(tài)管理、智能的依賴注入和便捷的路由管理。
1、相關(guān)優(yōu)勢:
三、使用
1、第一步 引入get
2、第二步
修改入口、配置路由
3、路由
Routes類
Pages類
4、狀態(tài)管理
我一般一個(gè)page對應(yīng)一個(gè)controller, controller來處理邏輯,控制page.
簡單使用
5、依賴注入
依賴注入也是我喜歡的,可以減少很多工作。
第一步
第二步
6、跨頁面交互
7、黑暗模式
可以參考前期寫的博客。 黑暗模式的適配
文/陳爐軍
整理/LiveVideoStack
大家好,我是阿里巴巴閑魚事業(yè)部的陳爐軍,本次分享的主題是Flutter浪潮下的音視頻研發(fā)探索,主要內(nèi)容是針對閑魚APP在當(dāng)下流行的跨平臺(tái)框架Flutter的大規(guī)模實(shí)踐,介紹其在音視頻領(lǐng)域碰到的一些困難以及解決方案。
分享內(nèi)容主要分為四個(gè)方面,首先會(huì)對Flutter有一個(gè)簡單介紹以及選擇Flutter作為跨平臺(tái)框架的原因,其次會(huì)介紹Flutter中與音視頻關(guān)系非常大的外接紋理概念,以及對它做出的一些優(yōu)化。之后會(huì)對閑魚在音視頻實(shí)踐過程中碰到的一些Flutter問題提出了一些解決方案——TPM音視頻框架。最后是閑魚Flutter多媒體開源組件的介紹。
Flutter
Flutter是一個(gè)跨平臺(tái)框架,以往的做法是將音頻、視頻和網(wǎng)絡(luò)這些模塊都下沉到C++層或者ARM層,在其上封裝成一個(gè)音視頻的SDK,供UI層的PC、iOS和Android調(diào)用。
而Flutter做為一個(gè)UI層的跨平臺(tái)框架,顧名思義就是在UI層也實(shí)現(xiàn)了一個(gè)跨平臺(tái)開發(fā)??梢灶A(yù)想的是未Flutter發(fā)展的好的話,會(huì)逐漸變?yōu)橐粋€(gè)從底層到UI層的一個(gè)全鏈路的跨平臺(tái)開發(fā),技術(shù)人員分別負(fù)責(zé)SDK和UI層的開發(fā)。
在Flutter之前已經(jīng)有很多跨平臺(tái)UI解決方案,那為什么選擇Flutter呢?
我們主要考慮性能和跨平臺(tái)的能力。
以往的跨平臺(tái)方案比如Weex,ReactNative,Cordova等等因?yàn)榧軜?gòu)的原因無法滿足性能要求,尤其是在音視頻這種性能要求幾乎苛刻的場景。
而諸如Xamarin等,雖然性能可以和原生App一致,但是大部分邏輯還是需要分平臺(tái)實(shí)現(xiàn)。
我們可以看一下,為什么Flutter可以實(shí)現(xiàn)高性能:
原生的native組件渲染以IOS為例,蘋果的UIKit通過調(diào)用平臺(tái)自己的繪制框架QuaztCore來實(shí)現(xiàn)UI的繪制,圖形繪制也是調(diào)用底層的API,比如OpenGL、Metal等。
而Flutter也是和原生API邏輯一致,也是通過調(diào)用底層的繪制框架層SKIA實(shí)現(xiàn)UI層。這樣相當(dāng)于Flutter他自己實(shí)現(xiàn)了一套UI框架,提供了一種性能超越原生API的跨平臺(tái)可能性。
但是我們說一個(gè)框架最終性能怎樣,其實(shí)取決于設(shè)計(jì)者和開發(fā)者。至于現(xiàn)在到底是一個(gè)什么狀況:
在閑魚的實(shí)踐中,我們發(fā)現(xiàn)在正常的開發(fā)沒有特意的去優(yōu)化UI代碼的情況下,在一些低端機(jī)上,F(xiàn)lutter界面的流暢性是比Native界面要好的。
雖然現(xiàn)在閑魚某些場景下會(huì)有卡頓閃退等情況,但是這是一個(gè)新事物發(fā)展過程中的必然問題,我們相信未來性能肯定不會(huì)成為限制Flutter發(fā)展的瓶頸的。
在閑魚實(shí)踐Flutter的過程中,混合棧和音視頻是其中比較難解決的兩個(gè)問題,混合棧是指一個(gè)APP在Flutter過程中不可能一口氣將所有業(yè)務(wù)全部重寫為Flutter,所以這是一個(gè)逐步迭代的過程,這期間原生native界面與Flutter界面共存的狀態(tài)就稱之為混合棧。閑魚在混合棧上也有一些比較好的輸出,例如FlutterBoost。
外接紋理
在講音視頻之前需要簡要介紹一下外接紋理的概念,我們將它稱之為是Flutter和Frame之間的橋梁。
Flutter渲染一幀屏幕數(shù)據(jù)首先要做的是,GPU發(fā)出的VC信號在Flutter的UI線程,通過AOT編譯的機(jī)器碼結(jié)合當(dāng)前Dart Runtime,生成Layer Tree UI樹,Layer Tree上每一個(gè)葉子節(jié)點(diǎn)都代表了當(dāng)前屏幕上所需要渲染的每一個(gè)元素,包含了這些元素渲染所需要的內(nèi)容。將Layer Tree拋給GPU線程,在GPU線程內(nèi)調(diào)用Skia去完成整個(gè)UI的渲染過程。Layer Tree中有PictureLayer和TextureLayer兩個(gè)比較重要的節(jié)點(diǎn)。PictureLayer主要負(fù)責(zé)屏幕圖片的渲染,F(xiàn)lutter內(nèi)部實(shí)現(xiàn)了一套圖片解碼邏輯,在IO線程將圖片讀取或者從網(wǎng)絡(luò)上拉取之后,通過解碼能夠在IO線程上加載出紋理,交給GPU線程將圖片渲染到屏幕上。但是由于音視頻場景下系統(tǒng)API太過繁多,業(yè)務(wù)場景過于復(fù)雜。Flutter沒有一套邏輯去實(shí)現(xiàn)跨平臺(tái)的音視頻組件,所以說Flutter提出了一種讓第三方開發(fā)者來實(shí)現(xiàn)音視頻組件的方式,而這些音視頻組件的視頻渲染出口,就是TextureLayer。
在整個(gè)Layer Tree渲染的過程中,TextureLayer的數(shù)據(jù)紋理需要由外部第三方開發(fā)者來指定,可以把視頻數(shù)據(jù)和播放器數(shù)據(jù)送到TextureLayer里,由Flutter將這些數(shù)據(jù)渲染出來。
TextureLayer渲染過程:首先判斷Layer是否已經(jīng)初始化,如果沒有就創(chuàng)建一個(gè)Texture,然后將Texture Attach到一個(gè)SufaceTexture上。
這個(gè)SufaceTexture是音視頻的native代碼可以獲取到的對象,通過這個(gè)對象創(chuàng)建的Suface,我們可以將視頻數(shù)據(jù)、攝像頭數(shù)據(jù)解碼放到Suface中,然后Flutter端通過監(jiān)聽SufaceTexture的數(shù)據(jù)更新就可以順利把剛才創(chuàng)建的數(shù)據(jù)更新到它的紋理中,然后再將紋理交給SKIA渲染到屏幕上。
然而我們?nèi)绻枰肍lutter實(shí)現(xiàn)美顏,濾鏡,人臉貼圖等等功能,就需要將視頻數(shù)據(jù)讀取出來,更新到紋理中,再將GPU紋理經(jīng)過美顏濾鏡處理后生成一個(gè)處理后的紋理。按Flutter提供的現(xiàn)有能力,必須先將紋理中的數(shù)據(jù)從GPU讀出到CPU中,生成Bitmap后再寫入Surface中,這樣在Flutter中才能順利的更新到視頻數(shù)據(jù),這樣做對系統(tǒng)性能的消耗很大。
通過對Flutter渲染過程分析,我們知道Flutter底層需要渲染的數(shù)據(jù)就是GPU紋理,而我們經(jīng)過美顏濾鏡處理完成以后的結(jié)果也是GPU紋理,如果可以將它直接交給Flutter渲染,那就可以避免GPU-CPU-GPU這樣的無用循環(huán)。這樣的方法是可行的,但是需要一個(gè)條件,就是OpenGL上下文共享。
OpenGL
在說上下文之前,得提到一個(gè)和上線文息息相關(guān)的概念:線程。
Flutter引擎啟動(dòng)后會(huì)啟動(dòng)四個(gè)線程:
第一個(gè)線程是UI線程,這是Flutter自己定義的UI線程,主要負(fù)責(zé)GPU發(fā)出的VSync信號時(shí)候用當(dāng)前Dart編譯的機(jī)器碼和當(dāng)前運(yùn)行環(huán)境創(chuàng)建出Layer Tree。
還有就是IO線程和GPU線程。和大部分OpenGL處理解決方案中一樣,F(xiàn)lutter也采取一個(gè)線程責(zé)資源加載,一部分負(fù)責(zé)資源渲染這種思路。
兩個(gè)線程之間紋理共享有兩種方式。一種是EGLImage(IOS是 CVOpenGLESTextureCache)。一種是OpenGL Share Context。Flutter通過Share Context來實(shí)現(xiàn)紋理共享,將IO線程的Context和GPU線程的Context進(jìn)行Share,放到同一個(gè)Share Group下面,這樣兩個(gè)線程下資源是互相可見可以共享的。
Platform線程是主線程,F(xiàn)lutter中有一個(gè)很奇怪的設(shè)定,GPU線程和主線程共用一個(gè)Context。并且在主線程也有很多OpenGL 操作。
這樣的設(shè)計(jì)會(huì)給音視頻開發(fā)帶來很多問題,后面會(huì)詳細(xì)說。
音視頻端美顏處理完成的OpenGL紋理能夠讓Flutter直接使用的條件就是Flutter的上下文需要和平臺(tái)音視頻相關(guān)的OpenGL上下文處在一個(gè)Share Group下面。
由于Flutter主線程的Context就是GPU的Context,所以在音視頻端主線程中有一些OpenGL操作的話,很有可能使Flutter整個(gè)OpenGL被破壞掉。所以需要將所有的OpenGL操作都限制在子線程中。
通過上述這兩個(gè)條件的處理,我們就可以在沒有增加GPU消耗的前提下實(shí)現(xiàn)美顏和濾鏡等等功能。
TPM
在經(jīng)過demo驗(yàn)證之后,我們將這個(gè)方案應(yīng)用到閑魚音視頻組件中,但改造過程中發(fā)現(xiàn)了一些問題。
上圖是攝像頭采集數(shù)據(jù)轉(zhuǎn)換為紋理的一段代碼,其中有兩個(gè)操作:首先是切進(jìn)程,將后面的OpenGL操作都切到cameraQueue中。然后是設(shè)置一次上下文。然后這種限制條件或者說是潛規(guī)則往往在開發(fā)過程中容易被忽略的。而這個(gè)條件一旦忽略后果就是出現(xiàn)一些莫名其妙的詭異問題極難排查。因此我們就希望能抽象出一套框架,由框架本身實(shí)現(xiàn)線程的切換、上下文和模塊生命周期等的管理,開發(fā)者接入框架以后只需要安心實(shí)現(xiàn)自己的算法,而不需要關(guān)心這些潛規(guī)則還有其他一些重復(fù)的邏輯操作。
在引入Flutter之前閑魚的音視頻架構(gòu)與大部分音視頻邏輯一樣采用分層架構(gòu):
1:底層是一些獨(dú)立模塊
2:SDK層是對底層模塊的封裝
3:最上層是UI層。
引入Flutter之后,通過分析各個(gè)模塊的使用場景,我們可以得出一個(gè)假設(shè)或者說是抽象:音視頻應(yīng)用在終端上可以歸納為視頻幀解碼之后視頻數(shù)據(jù)幀在各個(gè)模塊之間流動(dòng)的過程,基于這種假設(shè)去做Flutter音視頻框架的抽象。
咸魚Flutter多媒體開源組件
整個(gè)Flutter音視頻框架抽象分為管線和數(shù)據(jù)的抽象、模塊的抽象、線程統(tǒng)一管理和上下文同一管理四部分。
管線,其實(shí)就是視頻幀流動(dòng)的管道。數(shù)據(jù),音視頻中涉及到的數(shù)據(jù)包括紋理、Bit Map以及時(shí)間戳等。結(jié)合現(xiàn)有的應(yīng)用場景我們定義了管線流通數(shù)據(jù)以Texture為主數(shù)據(jù),同時(shí)可以選擇性的添加Bit Map等作為輔助數(shù)據(jù)。這樣的數(shù)據(jù)定義方式,避免重復(fù)的創(chuàng)建和銷毀紋理帶來的性能開銷以及多線程訪問紋理帶來的一些問題。也滿足一些特殊模塊對特殊數(shù)據(jù)的需求。同時(shí)也設(shè)計(jì)了紋理池來管理管線中的紋理數(shù)據(jù)。
模塊:如果把管線和數(shù)據(jù)比喻成血管和血液,那框架音視頻的場景就可以比喻成器官,我們根據(jù)模塊所在管線的位置抽象出采集、處理和輸出三個(gè)基類。這三個(gè)基類里實(shí)現(xiàn)了剛才說的線程切換,上下文切換,格式轉(zhuǎn)換等等共同邏輯,各個(gè)功能模塊通過集成自這些基類,可以避免很多重復(fù)勞動(dòng)。
線程:每一個(gè)模塊初始化的時(shí)候,初始化函數(shù)就會(huì)去線程管理的模塊去獲取自己的線程,線程管理模塊可以決定給初始化函數(shù)分配新的線程或者已經(jīng)分配過其他模塊的線程。
這樣有三個(gè)好處:
一是可以根據(jù)需要去決定一個(gè)線程可以掛載多少模塊,做到線程間的負(fù)載均衡。第二,多線程并發(fā)式能夠保證模塊內(nèi)的OpenGL操作是在當(dāng)前線程內(nèi)而不會(huì)跑到主線程去,徹底避免Flutter的OpenGL 環(huán)境被破壞。第三,多線程并行可以充分利用CPU多核架構(gòu),提升處理速度。
從Flutter端修改Flutter引擎將Context取出后,根據(jù)Context創(chuàng)建上下文的統(tǒng)一管理模塊,每一個(gè)模塊在初始化的時(shí)候會(huì)獲取它的線程,獲取之后會(huì)調(diào)用上下文管理模塊獲取自己的上下文。這樣可以保證每一個(gè)模塊的上下文都是與Flutter的上下文進(jìn)行Share的,每個(gè)模塊之間資源都是共享可見的,F(xiàn)lutter和音視頻native之間也是互相共享可見的。
基于上述框架如果要實(shí)現(xiàn)一個(gè)簡單的場景,比如畫面實(shí)時(shí)預(yù)覽和濾鏡處理功能,
1:需要選擇功能模塊,功能模塊包括攝像頭模塊、濾鏡處理模塊和Flutter畫面渲染模塊,
2:需要配置模塊參數(shù),比如采集分辨率、濾鏡參數(shù)和前后攝像頭設(shè)置等,
3:在創(chuàng)建視頻管線后使用已配置的參數(shù)創(chuàng)建模塊
4:最后管線搭載模塊,開啟管線就可以實(shí)現(xiàn)這樣簡單的功能。
上圖為整個(gè)功能實(shí)現(xiàn)的代碼和結(jié)構(gòu)圖。
結(jié)合上述音視頻框架,閑魚實(shí)現(xiàn)了Flutter多媒體開源組件。
組要包含四個(gè)基本組件分別是:
1:視頻圖像拍攝組件
2:播放器組件
3:視頻圖像編輯組件
4:相冊選擇組件
現(xiàn)在這些組件正在走內(nèi)部開源流程。預(yù)計(jì)9月份,相冊和播放器會(huì)實(shí)現(xiàn)開源。
后續(xù)展望和規(guī)劃
1:實(shí)現(xiàn)開頭所說的從底層SDK到UI的全鏈路的跨端開發(fā)。目前底層框架層和模塊層都是各個(gè)平臺(tái)各自實(shí)現(xiàn),反而是Flutter的UI端進(jìn)行了跨平臺(tái)的統(tǒng)一,所以后續(xù)會(huì)將底層也按照音視頻常用做法把邏輯下沉到C++層,盡可能的實(shí)現(xiàn)全鏈路跨平臺(tái)。
2:第二部分內(nèi)容為開源共建,閑魚開源的內(nèi)容不僅包括拍攝、編輯組件,還包括了很多底層模塊,希望有開發(fā)者在基于Flutter開發(fā)音視頻應(yīng)用時(shí)可以充分利用閑魚開源出的音視頻模塊能力,搭建APP框架,開發(fā)者只要去負(fù)責(zé)實(shí)現(xiàn)特殊需求模塊就可以,盡可能的減少重復(fù)勞動(dòng)。
Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計(jì)算機(jī)編程語言,語法類似C,是編譯型語言:
hello world例子,打印字符串“Hello World!”:
1、沒有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個(gè)橋接層,所以界面渲染會(huì)慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗(yàn)跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:
Dart可以被編譯成不同平臺(tái)的本地代碼,讓Flutter不通過橋接層直接跟平臺(tái)通信,自然性能會(huì)快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。
3、Flutter Engine虛擬機(jī)
Flutter是依靠Flutter Engine虛擬機(jī)在iOS和Android上運(yùn)行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內(nèi)部進(jìn)行交互,所以具有輸入低延遲和UI渲染高幀速率的特點(diǎn)。除了這特點(diǎn)之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構(gòu)建的。 中心思想是您使用小部件構(gòu)建UI。
窗口小部件根據(jù)其當(dāng)前配置和狀態(tài)描述了它們的視圖。 當(dāng)窗口小部件的狀態(tài)發(fā)生更改時(shí),窗口小部件會(huì)重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹從一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)所需的最小更改。可以直接在OS平臺(tái)提供的畫布上進(jìn)行描繪,也就是一些核心類庫直接放到虛擬機(jī)里面,調(diào)用起來更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類似安卓的ART(Android Run Time)虛擬機(jī),同樣采用AOT(Ahead of TIme)技術(shù),會(huì)在APP安裝時(shí)就編譯成機(jī)器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運(yùn)行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺(tái)上Flutter也會(huì)把Skia引擎打包到APP中,從而實(shí)現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會(huì)是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問題就是需要學(xué)習(xí)一門新的語言:Dart,而有Java或者C#語言基礎(chǔ)的程序員會(huì)比較容易學(xué)習(xí)。
Uniapp目前比較成熟,而且用的是Vue語法,學(xué)習(xí)成本比較低,而且行業(yè)里面用的也比較廣泛,而Flutter的話,學(xué)習(xí)成本略高,因?yàn)橐獙W(xué)習(xí)新的語言,還有就是目前生態(tài)不是特別完備,等他再發(fā)展發(fā)展吧。黑馬程序員官網(wǎng)有成套免費(fèi)視頻哦,有什么不懂的可以直接過去學(xué)習(xí)。您的采納是對我成長的鞭策