在是過年假期,我們都喜歡在家看一些影視劇或電影消遣娛樂,但是我家的電視款式較老,不像現在的新款電視可以無線投屏、在線點播,所以我平時都是用手機看的,不過看久了眼睛就會不舒服,為了保護好眼睛,使用大屏幕設備觀看會好很多。
我家里正好有一部三星S10e,就想起有一個Samsung DeX功能,可以把手機搖身一變成電腦,找來一根三星智能投屏轉換線,體驗一下大屏看片的感覺。
Samsung DeX是一款應用類,需要硬件的支持才能實現。三星官方配套支持Samsung DeX功能的硬件也經歷了三代的演化,第一代名為DeX Station,國內稱為DeX智能手機拓展塢,具有一個type-c充電口,一個HDMI,一個有線網絡接口,兩個USB2.0接口,可以同時連接鼠標、鍵盤、顯示器和有線網絡,真有一種迷你電腦的意思,當不過官網上799元的價格讓人望而卻步。
第二代名為DeX Pad,比第一代少了網線接口,變得更加輕薄,但是在國內市場并沒有正式推出。它在美國三星官網的售價為99.99美元,約合人民幣約673元,還是有點不親民。
第三代為DeX Cable,在國內叫做智能投屏轉換線,整體形態以線纜的形式展現,優點是剔除了多余接口,更加小巧輕便,攜帶方便。雖然官方的宣傳圖上有三種配件,但是國內官網目前只有智能投屏轉換線在賣,售價為258元。
在實際操作時,更改手機觸摸屏的靈敏度,完全可以達到筆記本觸摸板級別的交互反饋,但最多支持單指的點擊和雙指滑動,長按可以拖動窗口。即使沒有外置鍵盤,通過三星Note10系列的虛擬鍵盤,也可以完成文字輸入,而且宣發過程中也不止一次提到Samsung DeX配合S Pen能夠編輯圖畫——能夠看出三星在拓寬Samsung DeX的利用場景方面做出了不小的努力。
與類PC的桌面方式配套的是Samsung DeX的類PC操作體驗,但畢竟是輕巧的安卓手機演化而來,配合上大屏幕,使用時會有一種突破手機尺寸的新鮮感。比如可以直接調出APP抽屜,全覽手機安裝的程序,大屏幕的優勢顯露無疑。
主界面
其實體驗過后,Samsung DeX給我的感覺就是新鮮感十足但是實用性不足。Samsung DeX干凈清爽的界面、適配完美的app在大屏上的體驗,是強于手機屏幕的。輕量級的辦公或演示也非常合適,真正的辦公還是移步PC上吧。配合屏幕共享,投屏看大片是個很好的體驗,不過現在無線投屏技術普及,像我這樣的需求還只屬于小眾。
T之家 1 月 9 日消息,CES 2024 盛會即將拉開帷幕,三星在本周接連發布了多款新品,涵蓋電視、投影儀、筆記本電腦以及智能家電等領域。雖然 Galaxy Book 4 系列此前已經亮相,但三星今天宣布了該系列筆記本電腦的全新功能,三星正在與微軟合作,將 Galaxy 智能手機與 Galaxy Book 筆記本電腦進行更深入的集成。
Galaxy Book 4 系列現在可以將配對的 Galaxy 智能手機攝像頭作為其網絡攝像頭,在需要更高畫質時提供更出色的視頻通話體驗。用戶可以隨時在智能手機的前置和后置攝像頭之間切換,雖然 Galaxy Book 4 自身也配備了不錯的 2MP 網絡攝像頭,但當需要更高畫質進行產品展示、演示文稿或遠程拍攝時,智能手機攝像頭就派上用場了。
三星表示,在使用 Galaxy 手機攝像頭作為 Galaxy Book 4 網絡攝像頭時,還可以享受自動構圖和背景虛化等高級功能。這項功能適用于包括微軟 Teams 在內的任何視頻會議應用。這與蘋果的“Continuity Camera”功能類似,后者同樣可以讓用戶在 Mac 電腦上使用 iPhone 的攝像頭。
IT之家注意到,三星還宣布,微軟 Copilot 現在可以訪問手機上的消息并進行總結。用戶可以在筆記本電腦的網絡瀏覽器上查看消息中的鏈接,并通過 Copilot 查找餐廳評分,Copilot 甚至可以代表用戶創建和發送消息。
開發一款 App,難不難?
軟件工程師 Thomas SIMON 閑暇之余用實踐回答道:其實說難也不難。
當他拿起一個 Android 手機,想要將其作為電腦攝像頭和麥克風使用時,他只寫了 40 行代碼就實現了這一功能。
只不過,令他苦惱的是,寫 40 行代碼背后需要安裝超過 20GB 的工具、也需要創建數十個項目文件才能以運行。
當他把自己的這段經歷分享到網上時,沒想到,引起了多位開發者的共鳴,紛紛表示,這種感覺太熟悉了。
在分享的文章中,Thomas SIMON 引用馬斯克曾經說過的一句話,「聰明工程師會犯的最常見錯誤,就是優化本不該存在的東西」。開發本身或許并不難,只是被平白增加了很多的復雜性。
接下來,我們將從 Thomas SIMON 的經歷中了解開發者那些本該避開的坑。
需要一個 App,把 Android 手機變成電腦攝像頭和麥克風
之所以想要開發一款 App,是因為作為一名軟件工程師,Thomas SIMON 平時保持著視頻錄制分享技術的習慣。
此前,他主要使用 Android 手機來錄制視頻。與臺式機上的 Linux 系統相比,Android 系統的兼容性很好,而且它很少出錯,即使出錯,也是以眾人可接受的方式,譬如電池電量不足、系統更新等等。
后來,Thomas SIMON 決定和一位朋友一起錄制他們技術分享,并將其作為播客片段上傳到網絡上,期間需要對錄制的文件進行剪輯、制作等等,還是電腦好操作一些。
不過,Thomas SIMON 的 Linux 系統電腦并沒有攝像頭,所以在他的計劃中,原來是想要將 Linux 電腦作為主設備進行錄制,然后使用手機上的攝像頭和麥克風加入通話。
然而,在錄制期間需要管理兩臺設備非常麻煩,況且搭載 Linux 系統的電腦設備本身就有一個不錯的麥克風,所以,此時只要有一個 Linux 兼容的網絡攝像頭存在就可以解決難題。
在研究市場上現有的網絡攝像頭之后,Thomas SIMON 認為那些設備不僅價格昂貴,而且質量還不如幾年前的中檔手機后置攝像頭。
恰巧他手頭正好有一部三星 S20,手機的后置鏡頭是長焦鏡頭,非常適合拍攝人像,平行光線讓人臉看起來清晰、漂亮。
在這樣的背景下,Thomas SIMON 萌生了自己開發一個 Android App 的想法,只需要通過 Wi-Fi 或其他方式將手機攝像頭的數據流重定向到他的電腦上,讓他的 Linux 電腦相信 Android 手機是一個攝像頭,或者讓 Linux 的應用程序(如 Google Meet 和 Zoom)相信它是一個攝像頭即可。
也許有人會說,其實市場中也早已有了這樣的軟件,譬如 DroidCam。DroidCam 軟件分為兩部分,一部分是手機上安裝的軟件,稱為服務器;另一部分是 PC 上安裝的軟件,稱為客戶端。只需要 PC 和手機連接到同一個 Wi-Fi,就可以把手機作為電腦攝像頭。
不過,Thomas SIMON 在使用后發現,DroidCam 是一款被廣告限制且需要付費的應用程序,而且并非所有攝像頭都能顯示。同時,經過測試,它的質量令人無法接受,即使是 720p 的低分辨率也被官方推薦。
無法忍受之下,Thomas SIMON 決定自己開發一款 Android App,把 Android 手機相機變成電腦的攝像頭。
這有什么難的?
通過多年的積累,Thomas SIMON 已經掌握了全棧、Linux、視頻流等方面的所有專業知識。其表示,”雖然我一直對手機應用程序敬而遠之,但我的整個職業生涯都是朝著網絡、服務器應用程序和桌面原生應用程序方向發展的。“
所以,對于 Thomas SIMON 而言,開發一款 Android App 難度其實并不大。而且在他的規劃中,他只想要一個包含選擇相機、分辨率和退出鍵這幾個菜單欄的 App, 并不需要有太多的設計感。
于是,Thomas SIMON 開始尋找制作 Android 應用程序的最簡單方法。他發現,幾乎每個專家都在積極推動 Android Studio 作為 IDE 開發環境。
不難想象,他下載了一個 Android Studio,結果發現,這是一個 1.1GB 的 .tar.gz 壓縮包,一旦安裝了所需的工具,最終會占用 20GB(分布在多個文件夾中)的空間。
安裝好工具之后,Thomas SIMON 開始尋找可以處理攝像頭的官方 APIs。
簡而言之,Thomas SIMON 試過 cameraX,這是一個 Jetpack 庫,旨在幫助簡化相機應用程序的開發,但它太高級了。所以 Thomas SIMON 最終使用了 camera2。
Thomas SIMON 下載了一個 camera2 的官方示例項目,其實他只想拼接一個 http 服務器并用來傳輸幀,在他的設想中,整個過程應該只需要幾分鐘就可以完成的。沒想到,厄運從這里才真正開始......
Thomas SIMON 表示,這個官方示例項目(github.com/android/camera-samples/tree/main/Camera2Basic)的作用只有「顯示攝像頭、并拍攝一張照片」,但是沒想到它包含了很多文件。
僅以 gradle 為關鍵詞搜索,就有一大堆文件:
$:/tmp/Camera2Basic$ find . -type f -name "_gradle_"
./gradlew.bat
./gradle.properties
./gradlew
./settings.gradle
./utils/build.gradle
./gradle/wrapper/gradle-wrapper.jar
./gradle/wrapper/gradle-wrapper.properties
./build.gradle
./app/build.gradle
Thomas SIMON 表示,自己不可能花時間去慢慢理解這些東西,他只是要修改一些代碼,來實現自己想要的功能。
不過,還沒等他開始尋找代碼片段,Android Studio 就開始跳出了一個提示:
"不支持 Java,點擊此處更新 gradle thingy"。
于是,事情似乎進入了循環:
Thomas SIMON 點擊。
事情發生了變化,左側窗格中的文件改變了結構,標簽頁反復打開和關閉。
"建議更新項目,點擊啟動 AGP 升級助手”
Thomas SIMON 繼續點擊:
顯示許多選項,其中一些已預選,一個按鈕上寫著 "運行選定步驟"。
Thomas SIMON 再次點擊:
事情發生了變化,左側窗格中的文件改變了結構,選項卡反復打開和關閉。
"建議更新項目,單擊啟動 AGP 升級助手
Thomas SIMON 點擊:
顯示大量選項,其中一些已預選,一個按鈕顯示 "運行選定步驟"。
Thomas SIMON 繼續點擊:
事情發生了變化,左側窗格中的文件改變了結構,標簽反復打開和關閉。
Thomas SIMON 無語道,“這是一款很棒的點擊冒險游戲。”
折騰了一會,Thomas SIMON 的 AGP 和 gradle 終于不再跳出更新提示。
接下來,正式進入代碼部分。
寫過不少 Java 和 Scala 代碼的 Thomas SIMON 發現這部分的代碼是用 Kotlin 寫的。
“從這里開始,我喜歡我所看到的,代碼很清晰。它在 xml 中定義一個視圖,在代碼中用標識符與之關聯,非常標準且可預測。清晰的代碼讓我不需要學習任何東西就能提高工作效率”,Thomas SIMON 說道。
緊接著,Thomas SIMON 調用一個 Android API 來制作一個簡單的 http 服務器,然后把它插入、測試,它就能工作了!
現在,Thomas SIMON 的電腦瀏覽器標簽頁上有一個 mjpeg 流。對于實時調用來說,質量和延遲都還可以。這樣,他就可以在終端輸入一行命令將其轉換為 Linux 網絡攝像頭設備:
ffmpeg -f mjpeg -i "http://192.168.1.2:8080" -vf "format=yuv420p" -f v4l2 /dev/video0
整體而言,Thomas SIMON 表示,網絡世界雖然有一些不必要的步驟和配置,但這個 Android 世界簡直是瘋了。
他下載了官方示例之后,刪除了未使用的視圖,添加了選擇相機、分辨率和質量的下拉菜單,將所有功能移至前臺服務,以便在鎖定手機的情況下保持激活狀態,并將其發布在 GitHub 上(https://github.com/Ruddle/RemoteCam),整個項目花了他兩個下午的時間(其中大部分時間都在了解 Android 希望你怎么做)。
實際工作量應該如何?
Thomas SIMON 認為,在理想的情況下,在手機端,只需一行代碼就足夠了,根本不需要上面那樣復雜的操作。倘若我們想編寫一個應用程序,只是為了準確地指定數據流,而不是依賴天才們已經開發出來的高級工具(如桌面上的 ffmpeg 和 v4l2)。
在理想的世界里,具有這種規格的 App 應具備:
允許配置相機、分辨率和質量/比特率
沒有設計,只有原始功能
在本地網絡上傳輸幀流
Thomas SIMON 表示,只需一個 40 行偽代碼(pseudo code,又稱虛擬代碼,是一種高層次描述算法的方法,它可能綜合使用多種編程語言的語法、保留字,甚至會用到自然語言)的文件就能實現以上功能:
1CAMERA.getPermission() or quit()
2NETWORK.getPermission() or quit()
3
4queue=Producer(size=1)
5
6server=NETWORK.createHttpServer(port=8080)
7server.onRequest=req ->
8 queue.dropConsumers() //only allows 1 client, drop old ones
9 req.sendHeader("Content-Type","multipart/x-mixed-replace;boundary=FRAME")
10 queue.consumeUntilDrop( frame, consumer ->
11 data="--FRAME=\r\nContent-Type=image/jpeg\r\n".bytes+frame.bytes
12 req.sendBytes(data) or queue.drop(consumer)
13 frame.close() // Free camera memory of this frame
14 )
15 req.close()
16
17options=STORAGE.get("config") or {sensor:0, format: "jpeg", fps:30, resolution:[1280,720]}
18
19session=CAMERA.open(options)
20session.onFrame=frame -> queue.pushTry(frame) or frame.close()
21
22UI.insert(UI.text).text="Choose a sensor:"
23dropdownSensors=UI.insert(UI.dropdown)
24dropdownSensors.selection=session.sensor
25dropdownSensors.values=CAMERA.sensors.map(_.name)
26dropdownSensors.onSelect=index ->
27 STORAGE.set("config", options + {sensor: index})
28 restart()
29
30UI.insert(UI.text).text="Choose a resolution:"
31dropdownResolution=UI.insert(UI.dropdown)
32dropdownResolution.selection=session.resolutions.indexOf(session.resolution)
33dropdownResolution.values=session.resolutions.map(_.0+"x"+_.1)
34dropdownResolution.onSelect=index ->
35 STORAGE.set("config", options + {resolution: session.resolutions[index]})
36 restart()
37
38quitBtn=UI.insert(UI.button)
39quitBtn.onClick=quit
40quitBtn.text="quit"
這段偽代碼雖然簡單,但明確指出了所需的內容。 其中,對 API 的訪問如CAMERA(攝像頭)、NETWORK(網絡)、UI(用戶界面)和 STORAGE(存儲)等都非常明顯易懂。
無需導入、無需 gradle、無需指定無用的用戶界面文件、無需多個事實來源。該文件非常簡短,Thomas SIMON 甚至懶得將存儲密鑰命名為 "config"。
Thomas SIMON 解釋道,“偽代碼假定是托管執行,就像 Kotlin 或 Java 一樣,允許非常容易地使用高階函數。支持這種單文本文件應用程序并不需要什么新東西。我們只需選擇一種語言,如 Python、Javascript 或 Kotlin,然后編寫一個庫來公開 API。我們甚至可以開發一個標準的 Android 應用程序,作為操作系統來執行這些單文本文件應用程序。但 Google 并不允許這樣做。從技術上講,你可以進行動態代碼加載,但一旦 Google 發現你可以讓人們繞過 Play 商店來加載小于 1kB 的應用程序,你就完了。此外,Google 和 Apple 已經在極力阻止 PWA(一種讓網頁擁有原生應用程序功能的技術)運行得太好。”
對于 Thomas SIMON 而言,他大概只用了 10 分鐘就寫出了這段偽代碼。其中有 5 分鐘是在網上查找如何在多部分 http 流中分離幀(獲取信息的難度出乎意料)。
就目前而言,其實通過一個 LLM(比如 ChatGPT,甚至是本地運行的 LLM)可以在 10 秒內寫完這段代碼,而且至少有一半的時間不會出錯。
經過 Gzip 壓縮后,一個文本文件應用程序的大小為 688 字節。
1$> gzip -k text_app; ls -lh
21,5K text_app
3688 text_app.gz
相比之下,Thomas SIMON 用 Android Studio 生成的 APK 只有 14.9MB。
至于用戶可能存疑的所有的 gradle 配置文件都在哪里?Thomas SIMON 表示,這些文件中 99% 的內容都是用來處理糟糕的抽象。
最后的 1% 可能只是文件頂部的一些注釋,如
// name:RemoteCam
// author:Thomas SIMON
// version:1.0
// icon: image/png;base64,ABC...
對于安全性、兼容性和更新等問題,Thomas SIMO 解釋道,這些問題都已經解決了。
安全性:只需根據你信任的文件進行簽名檢查。
兼容性:只需在文件頂部注釋 minAndroidVersion。
更新:替換應用程序文件即可。
這些問題都不能成為你在 Android 系統上制作應用程序的復雜性的借口。
這些問題都不能由應用程序商店自行解決(應用程序本身只有 40 行)。
結論
最后,Thomas SIMO 僅用了 40 行代碼就開發了一個網絡攝像頭 App,并將代碼開源在了 GitHub 上(https://github.com/Ruddle/RemoteCam)。
Thomas SIMO 表示,他用這款應用程序進行了兩次視頻通話,每次持續時間都在 1 小時 30 分鐘以上,它的表現非常出色。
經過自己開發了一款 App,他也終于明白為什么 DroidCam 試圖推銷付費模式,主要是因為開發一款 App 必須忍受的非必要工作和挫折實在太多,代碼沒寫多少,但其中的工具安裝、項目支持文件實在過于臃腫,最終導致你想向別人收費來尋求心理平衡罷了。
來源:https://thomassimon.dev/ps/2