操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    譯 | 蘇宓
    出品 | CSDN(ID:CSDNnews)

    開發(fā)一款 App,難不難?

    軟件工程師 Thomas SIMON 閑暇之余用實(shí)踐回答道:其實(shí)說難也不難。

    當(dāng)他拿起一個(gè) Android 手機(jī),想要將其作為電腦攝像頭和麥克風(fēng)使用時(shí),他只寫了 40 行代碼就實(shí)現(xiàn)了這一功能。

    只不過,令他苦惱的是,寫 40 行代碼背后需要安裝超過 20GB 的工具、也需要?jiǎng)?chuàng)建數(shù)十個(gè)項(xiàng)目文件才能以運(yùn)行。

    當(dāng)他把自己的這段經(jīng)歷分享到網(wǎng)上時(shí),沒想到,引起了多位開發(fā)者的共鳴,紛紛表示,這種感覺太熟悉了。

    在分享的文章中,Thomas SIMON 引用馬斯克曾經(jīng)說過的一句話,「聰明工程師會(huì)犯的最常見錯(cuò)誤,就是優(yōu)化本不該存在的東西」。開發(fā)本身或許并不難,只是被平白增加了很多的復(fù)雜性。

    接下來,我們將從 Thomas SIMON 的經(jīng)歷中了解開發(fā)者那些本該避開的坑。

    需要一個(gè) App,把 Android 手機(jī)變成電腦攝像頭和麥克風(fēng)

    之所以想要開發(fā)一款 App,是因?yàn)樽鳛橐幻浖こ處煟?span style='color: rgb(51, 51, 51);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 1px;text-wrap: wrap;background-color: rgb(255, 255, 255);'>Thomas SIMON 平時(shí)保持著視頻錄制分享技術(shù)的習(xí)慣。

    此前,他主要使用 Android 手機(jī)來錄制視頻。與臺式機(jī)上的 Linux 系統(tǒng)相比,Android 系統(tǒng)的兼容性很好,而且它很少出錯(cuò),即使出錯(cuò),也是以眾人可接受的方式,譬如電池電量不足、系統(tǒng)更新等等。

    后來,Thomas SIMON 決定和一位朋友一起錄制他們技術(shù)分享,并將其作為播客片段上傳到網(wǎng)絡(luò)上,期間需要對錄制的文件進(jìn)行剪輯、制作等等,還是電腦好操作一些。

    不過,Thomas SIMON 的 Linux 系統(tǒng)電腦并沒有攝像頭,所以在他的計(jì)劃中,原來是想要將 Linux 電腦作為主設(shè)備進(jìn)行錄制,然后使用手機(jī)上的攝像頭和麥克風(fēng)加入通話。

    然而,在錄制期間需要管理兩臺設(shè)備非常麻煩,況且搭載 Linux 系統(tǒng)的電腦設(shè)備本身就有一個(gè)不錯(cuò)的麥克風(fēng),所以,此時(shí)只要有一個(gè) Linux 兼容的網(wǎng)絡(luò)攝像頭存在就可以解決難題。

    在研究市場上現(xiàn)有的網(wǎng)絡(luò)攝像頭之后,Thomas SIMON 認(rèn)為那些設(shè)備不僅價(jià)格昂貴,而且質(zhì)量還不如幾年前的中檔手機(jī)后置攝像頭。

    恰巧他手頭正好有一部三星 S20,手機(jī)的后置鏡頭是長焦鏡頭,非常適合拍攝人像,平行光線讓人臉看起來清晰、漂亮。

    在這樣的背景下,Thomas SIMON 萌生了自己開發(fā)一個(gè) Android App 的想法,只需要通過 Wi-Fi 或其他方式將手機(jī)攝像頭的數(shù)據(jù)流重定向到他的電腦上,讓他的 Linux 電腦相信 Android 手機(jī)是一個(gè)攝像頭,或者讓 Linux 的應(yīng)用程序(如 Google Meet 和 Zoom)相信它是一個(gè)攝像頭即可。

    也許有人會(huì)說,其實(shí)市場中也早已有了這樣的軟件,譬如 DroidCam。DroidCam 軟件分為兩部分,一部分是手機(jī)上安裝的軟件,稱為服務(wù)器;另一部分是 PC 上安裝的軟件,稱為客戶端。只需要 PC 和手機(jī)連接到同一個(gè) Wi-Fi,就可以把手機(jī)作為電腦攝像頭。

    不過,Thomas SIMON 在使用后發(fā)現(xiàn),DroidCam 是一款被廣告限制且需要付費(fèi)的應(yīng)用程序,而且并非所有攝像頭都能顯示。同時(shí),經(jīng)過測試,它的質(zhì)量令人無法接受,即使是 720p 的低分辨率也被官方推薦。

    無法忍受之下,Thomas SIMON 決定自己開發(fā)一款 Android App,把 Android 手機(jī)相機(jī)變成電腦的攝像頭。

    這有什么難的?

    通過多年的積累,Thomas SIMON 已經(jīng)掌握了全棧、Linux、視頻流等方面的所有專業(yè)知識。其表示,”雖然我一直對手機(jī)應(yīng)用程序敬而遠(yuǎn)之,但我的整個(gè)職業(yè)生涯都是朝著網(wǎng)絡(luò)、服務(wù)器應(yīng)用程序和桌面原生應(yīng)用程序方向發(fā)展的。“

    所以,對于 Thomas SIMON 而言,開發(fā)一款 Android App 難度其實(shí)并不大。而且在他的規(guī)劃中,他只想要一個(gè)包含選擇相機(jī)、分辨率和退出鍵這幾個(gè)菜單欄的 App, 并不需要有太多的設(shè)計(jì)感。

    于是,Thomas SIMON 開始尋找制作 Android 應(yīng)用程序的最簡單方法。他發(fā)現(xiàn),幾乎每個(gè)專家都在積極推動(dòng) Android Studio 作為 IDE 開發(fā)環(huán)境。

    不難想象,他下載了一個(gè) Android Studio,結(jié)果發(fā)現(xiàn),這是一個(gè) 1.1GB 的 .tar.gz 壓縮包,一旦安裝了所需的工具,最終會(huì)占用 20GB(分布在多個(gè)文件夾中)的空間

    安裝好工具之后,Thomas SIMON 開始尋找可以處理攝像頭的官方 APIs。

    簡而言之,Thomas SIMON 試過 cameraX,這是一個(gè) Jetpack 庫,旨在幫助簡化相機(jī)應(yīng)用程序的開發(fā),但它太高級了。所以 Thomas SIMON 最終使用了 camera2。

    Thomas SIMON 下載了一個(gè) camera2 的官方示例項(xiàng)目,其實(shí)他只想拼接一個(gè) http 服務(wù)器并用來傳輸幀,在他的設(shè)想中,整個(gè)過程應(yīng)該只需要幾分鐘就可以完成的。沒想到,厄運(yùn)從這里才真正開始......

    Thomas SIMON 表示,這個(gè)官方示例項(xiàng)目(github.com/android/camera-samples/tree/main/Camera2Basic)的作用只有「顯示攝像頭、并拍攝一張照片」,但是沒想到它包含了很多文件。

    僅以 gradle 為關(guān)鍵詞搜索,就有一大堆文件:

    • $:/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 表示,自己不可能花時(shí)間去慢慢理解這些東西,他只是要修改一些代碼,來實(shí)現(xiàn)自己想要的功能。

      不過,還沒等他開始尋找代碼片段,Android Studio 就開始跳出了一個(gè)提示:

      "不支持 Java,點(diǎn)擊此處更新 gradle thingy"。

      于是,事情似乎進(jìn)入了循環(huán):

      Thomas SIMON 點(diǎn)擊。

      事情發(fā)生了變化,左側(cè)窗格中的文件改變了結(jié)構(gòu),標(biāo)簽頁反復(fù)打開和關(guān)閉。

      "建議更新項(xiàng)目,點(diǎn)擊啟動(dòng) AGP 升級助手”

      Thomas SIMON 繼續(xù)點(diǎn)擊:

      顯示許多選項(xiàng),其中一些已預(yù)選,一個(gè)按鈕上寫著 "運(yùn)行選定步驟"。

      Thomas SIMON 再次點(diǎn)擊:

      事情發(fā)生了變化,左側(cè)窗格中的文件改變了結(jié)構(gòu),選項(xiàng)卡反復(fù)打開和關(guān)閉。

      "建議更新項(xiàng)目,單擊啟動(dòng) AGP 升級助手

      Thomas SIMON 點(diǎn)擊:

      顯示大量選項(xiàng),其中一些已預(yù)選,一個(gè)按鈕顯示 "運(yùn)行選定步驟"。

      Thomas SIMON 繼續(xù)點(diǎn)擊:

      事情發(fā)生了變化,左側(cè)窗格中的文件改變了結(jié)構(gòu),標(biāo)簽反復(fù)打開和關(guān)閉。

      Thomas SIMON 無語道,“這是一款很棒的點(diǎn)擊冒險(xiǎn)游戲。”

      折騰了一會(huì),Thomas SIMON 的 AGP 和 gradle 終于不再跳出更新提示。

      接下來,正式進(jìn)入代碼部分。

      寫過不少 Java 和 Scala 代碼的 Thomas SIMON 發(fā)現(xiàn)這部分的代碼是用 Kotlin 寫的。

      “從這里開始,我喜歡我所看到的,代碼很清晰。它在 xml 中定義一個(gè)視圖,在代碼中用標(biāo)識符與之關(guān)聯(lián),非常標(biāo)準(zhǔn)且可預(yù)測。清晰的代碼讓我不需要學(xué)習(xí)任何東西就能提高工作效率”,Thomas SIMON 說道。

      緊接著,Thomas SIMON 調(diào)用一個(gè) Android API 來制作一個(gè)簡單的 http 服務(wù)器,然后把它插入、測試,它就能工作了!

      現(xiàn)在,Thomas SIMON 的電腦瀏覽器標(biāo)簽頁上有一個(gè) mjpeg 流。對于實(shí)時(shí)調(diào)用來說,質(zhì)量和延遲都還可以。這樣,他就可以在終端輸入一行命令將其轉(zhuǎn)換為 Linux 網(wǎng)絡(luò)攝像頭設(shè)備:

      ffmpeg -f mjpeg -i "http://192.168.1.2:8080" -vf "format=yuv420p" -f v4l2 /dev/video0

      整體而言,Thomas SIMON 表示,網(wǎng)絡(luò)世界雖然有一些不必要的步驟和配置,但這個(gè) Android 世界簡直是瘋了。

      他下載了官方示例之后,刪除了未使用的視圖,添加了選擇相機(jī)、分辨率和質(zhì)量的下拉菜單,將所有功能移至前臺服務(wù),以便在鎖定手機(jī)的情況下保持激活狀態(tài),并將其發(fā)布在 GitHub 上(https://github.com/Ruddle/RemoteCam),整個(gè)項(xiàng)目花了他兩個(gè)下午的時(shí)間(其中大部分時(shí)間都在了解 Android 希望你怎么做)。

      實(shí)際工作量應(yīng)該如何?

      Thomas SIMON 認(rèn)為,在理想的情況下,在手機(jī)端,只需一行代碼就足夠了,根本不需要上面那樣復(fù)雜的操作。倘若我們想編寫一個(gè)應(yīng)用程序,只是為了準(zhǔn)確地指定數(shù)據(jù)流,而不是依賴天才們已經(jīng)開發(fā)出來的高級工具(如桌面上的 ffmpeg 和 v4l2)。

      在理想的世界里,具有這種規(guī)格的 App 應(yīng)具備:

      • 允許配置相機(jī)、分辨率和質(zhì)量/比特率

      • 有設(shè)計(jì),只有原始功能

      • 在本地網(wǎng)絡(luò)上傳輸幀流

      Thomas SIMON 表示,只需一個(gè) 40 行偽代碼(pseudo code,又稱虛擬代碼,是一種高層次描述算法的方法,它可能綜合使用多種編程語言的語法、保留字,甚至?xí)玫阶匀徽Z言)的文件就能實(shí)現(xiàn)以上功能:

       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"

      這段偽代碼雖然簡單,但明確指出了所需的內(nèi)容。 其中,對 API 的訪問如CAMERA(攝像頭)、NETWORK(網(wǎng)絡(luò))、UI(用戶界面)和 STORAGE(存儲(chǔ))等都非常明顯易懂

      無需導(dǎo)入、無需 gradle、無需指定無用的用戶界面文件、無需多個(gè)事實(shí)來源。該文件非常簡短,Thomas SIMON 甚至懶得將存儲(chǔ)密鑰命名為 "config"。

      Thomas SIMON 解釋道,“偽代碼假定是托管執(zhí)行,就像 Kotlin 或 Java 一樣,允許非常容易地使用高階函數(shù)。支持這種單文本文件應(yīng)用程序并不需要什么新東西。我們只需選擇一種語言,如 Python、Javascript 或 Kotlin,然后編寫一個(gè)庫來公開 API。我們甚至可以開發(fā)一個(gè)標(biāo)準(zhǔn)的 Android 應(yīng)用程序,作為操作系統(tǒng)來執(zhí)行這些單文本文件應(yīng)用程序但 Google 并不允許這樣做。從技術(shù)上講,你可以進(jìn)行動(dòng)態(tài)代碼加載,但一旦 Google 發(fā)現(xiàn)你可以讓人們繞過 Play 商店來加載小于 1kB 的應(yīng)用程序,你就完了。此外,Google 和 Apple 已經(jīng)在極力阻止 PWA(一種讓網(wǎng)頁擁有原生應(yīng)用程序功能的技術(shù))運(yùn)行得太好。”

      對于 Thomas SIMON 而言,他大概只用了 10 分鐘就寫出了這段偽代碼。其中有 5 分鐘是在網(wǎng)上查找如何在多部分 http 流中分離幀(獲取信息的難度出乎意料)。

      就目前而言,其實(shí)通過一個(gè) LLM(比如 ChatGPT,甚至是本地運(yùn)行的 LLM)可以在 10 秒內(nèi)寫完這段代碼,而且至少有一半的時(shí)間不會(huì)出錯(cuò)。

      經(jīng)過 Gzip 壓縮后,一個(gè)文本文件應(yīng)用程序的大小為 688 字節(jié)。

      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% 的內(nèi)容都是用來處理糟糕的抽象。

      最后的 1% 可能只是文件頂部的一些注釋,如

      • // name:RemoteCam// author:Thomas SIMON// version:1.0// icon: image/png;base64,ABC...

        對于安全性、兼容性和更新等問題,Thomas SIMO 解釋道,這些問題都已經(jīng)解決了。

        • 安全性:只需根據(jù)你信任的文件進(jìn)行簽名檢查。

        • 兼容性:只需在文件頂部注釋 minAndroidVersion。

        • 更新:替換應(yīng)用程序文件即可。

        這些問題都不能成為你在 Android 系統(tǒng)上制作應(yīng)用程序的復(fù)雜性的借口。

        這些問題都不能由應(yīng)用程序商店自行解決(應(yīng)用程序本身只有 40 行)。

        結(jié)論

        最后,Thomas SIMO 僅用了 40 行代碼就開發(fā)了一個(gè)網(wǎng)絡(luò)攝像頭 App,并將代碼開源在了 GitHub 上(https://github.com/Ruddle/RemoteCam)。

        Thomas SIMO 表示,他用這款應(yīng)用程序進(jìn)行了兩次視頻通話,每次持續(xù)時(shí)間都在 1 小時(shí) 30 分鐘以上,它的表現(xiàn)非常出色。

        經(jīng)過自己開發(fā)了一款 App,他也終于明白為什么 DroidCam 試圖推銷付費(fèi)模式,主要是因?yàn)殚_發(fā)一款 App 必須忍受的非必要工作和挫折實(shí)在太多,代碼沒寫多少,但其中的工具安裝、項(xiàng)目支持件實(shí)在過于臃腫,最終導(dǎo)致你想向別人收費(fèi)來尋求心理平衡罷了。

        來源:https://thomassimon.dev/ps/2

    這個(gè)數(shù)字化時(shí)代,手機(jī)成了我們隨身攜帶的攝影棚。無論是旅途中的美景,還是與朋友歡聚的瞬間,手機(jī)總能輕松捕捉。然而,手機(jī)存儲(chǔ)空間有限,那些珍貴的照片和視頻,怎樣才能安全又方便地保存下來,供我們隨時(shí)回味呢?

    想象一下,你站在山頂,迎著微風(fēng),拍下了一張絕美的風(fēng)景照。你希望這張照片能出現(xiàn)在你的工作記事本中,成為你努力工作的動(dòng)力。或者是,在一次重要的商務(wù)會(huì)議上,你迅速用手機(jī)拍下了一張包含關(guān)鍵信息的PPT,急需將這張圖片上傳到電腦記事本中,以便后續(xù)詳細(xì)分析和整理。

    這時(shí)候,能夠輕松將手機(jī)圖片同步到電腦記事本敬業(yè)簽。它不僅僅是一個(gè)記事本,更是一個(gè)強(qiáng)大的同步助手。你只需在手機(jī)上打開,直接將圖片上傳到敬業(yè)簽中,然后,在電腦端登錄,那些手機(jī)上傳的圖片就赫然在列,清晰可見。

    更神奇的是,這些圖片不僅可以在電腦端查看,還可以輕松下載到本地,方便你進(jìn)行后續(xù)的編輯和分享。無論是制作工作匯報(bào),還是整理個(gè)人相冊,多端同步都能讓你事半功倍。

    現(xiàn)在,我不再擔(dān)心手機(jī)存儲(chǔ)空間不足,也不再為如何傳輸圖片而煩惱。他就像是一個(gè)貼心的助手,隨時(shí)隨地幫我管理著那些珍貴的記憶。

    如果你也像我一樣,渴望找到一個(gè)簡單、高效的方式來管理和同步你的照片,它會(huì)讓你的生活更加便捷,工作更加高效。

    如何把手機(jī)里的照片導(dǎo)到電腦上#

    標(biāo)題:如何把手機(jī)里的照片導(dǎo)到電腦上:簡單易行的步驟指南

    隨著智能手機(jī)的普及,我們拍攝的照片越來越多,而將這些照片導(dǎo)入到電腦上則成為了許多人的需求。本文將介紹幾種簡單易行的步驟,幫助你將手機(jī)里的照片導(dǎo)入到電腦上。

    一、通過數(shù)據(jù)線連接

    這是一種最直接的方法,只需要將手機(jī)通過數(shù)據(jù)線連接到電腦上,然后在電腦上打開文件管理器,就可以看到手機(jī)上的照片。你可以將照片復(fù)制到電腦上的任何位置,也可以將整個(gè)文件夾復(fù)制到電腦上。

    二、通過Wi-Fi連接

    如果你的手機(jī)和電腦都支持Wi-Fi連接,那么你也可以通過Wi-Fi將手機(jī)上的照片導(dǎo)入到電腦上。首先,需要在手機(jī)上安裝一個(gè)文件管理器應(yīng)用程序,然后在電腦上安裝一個(gè)相應(yīng)的應(yīng)用程序。接下來,通過Wi-Fi連接將手機(jī)和電腦連接起來,然后在電腦上打開文件管理器,就可以看到手機(jī)上的照片了。

    三、通過云存儲(chǔ)服務(wù)

    如果你已經(jīng)將照片上傳到了云存儲(chǔ)服務(wù)中,那么你也可以通過云存儲(chǔ)服務(wù)將照片導(dǎo)入到電腦上。首先,需要在手機(jī)上安裝一個(gè)云存儲(chǔ)服務(wù)應(yīng)用程序,然后在電腦上安裝相應(yīng)的應(yīng)用程序。接下來,登錄你的云存儲(chǔ)服務(wù)賬戶,就可以看到手機(jī)上的照片了。你可以將照片下載到電腦上,也可以直接在電腦上打開照片。

    四、通過第三方應(yīng)用程序

    除了以上幾種方法外,還可以通過第三方應(yīng)用程序?qū)⑹謾C(jī)上的照片導(dǎo)入到電腦上。這些應(yīng)用程序通常具有更強(qiáng)大的功能和更方便的操作方式。你可以在應(yīng)用商店中搜索相關(guān)的應(yīng)用程序,然后下載安裝即可。

    總之,將手機(jī)上的照片導(dǎo)入到電腦上并不難,只需要選擇適合你的方法即可。無論你選擇哪種方法,都需要確保你的手機(jī)和電腦都處于良好的連接狀態(tài),并且已經(jīng)安裝了相應(yīng)的應(yīng)用程序。希望本文能夠幫助你更好地將手機(jī)上的照片導(dǎo)入到電腦上。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有