正在檢查瀏覽器支援…
在分頁裡即時看手機螢幕,或把它錄成影片檔——兩件事都走 USB 線。
畫格在這個分頁裡解碼,錄影則直接串流寫進你的磁碟。什麼都不會上傳,手機上的暫存檔一複製完就刪掉。
正在檢查瀏覽器支援…
把 Android 手機用 USB 接到 Chromium 瀏覽器,這頁會對它的螢幕做兩件不一樣的事。鏡像是把畫面當成 H.264 串流過來、在分頁裡解碼,所以你會在一個視窗裡看到延遲幾十毫秒的手機。錄影是請手機自己的編碼器產生 MP4,再把那個檔案直接串流寫進你的磁碟。手機上什麼都不用裝,什麼都不會上傳。先講一句誠實話:鏡像需要 scrcpy 的 server 執行檔(Apache-2.0 授權),而這個靜態版本**沒有內建**它;沒有的時候這頁會直接說,不會裝作可以。錄影兩種情況都能用,因為它只需要 Android 本來就有的 screenrecord。
scrcpy 不是一個螢幕分享 app,而是一套協定加上一個小 server——由用戶端推到手機上、以 shell 使用者身分執行。那個 server 透過 SurfaceFlinger 擷取畫面,用手機的硬體 H.264 編碼器編碼,再從 ADB socket 送回來。用戶端要做的只有解碼和畫出來,這也正是瀏覽器有辦法當用戶端的原因。這裡的解碼用的是 WebCodecs 的 VideoDecoder,吃的是桌面用戶端拿到的同一條串流,畫到 canvas 上。反方向的操作(觸控與按鍵)也是同一套協定的一部分,而且已經接好,所以能跑起來的鏡像就是可以點的鏡像。
60 fps 的手機畫面遠遠超過 JavaScript 解碼器跟得上的量,所以沒有硬體解碼的鏡像不是「比較慢」,而是根本不成立。因此這頁在掛載之後才去偵測 VideoDecoder 支援,不支援的時候就直接說,而不是放一顆按下去只會給你一片黑的按鈕。Firefox 和 Safari 通常是不支援那邊,桌面的 Chromium 系通常是支援那邊。錄影完全不受這些影響:編碼在手機上做,你的瀏覽器只要把位元組寫進檔案。
它們看起來相鄰,行為卻完全不同。鏡像是即時的、什麼都不留:沒有檔案,關掉分頁兩台機器上都不留痕跡;它適合示範、盯著架上那台機器、或用鍵盤把某個流程點過去。錄影是一個有明確起點和終點的檔案,而且是手機做的不是我們做的;它適合 bug 回報或商店素材。這裡的錄影會在開始**之前**先選好你磁碟上的存放位置,因為 File System Access 的選擇器需要一次點擊,而位元組要幾分鐘後才會來;接著影片會以小塊從手機流進那個檔案,所以 2 GB 的擷取從來不會坐在分頁的記憶體裡。手機上的暫存檔一複製完就刪掉,而被拔線留下來的檔案會在下一次錄影開始前清掉。
錄影的限制是平台的限制,在這裡讀到比從壞掉的檔案裡發現要好。沒有聲音——screenrecord 只擷取影像,也沒有相關參數;Android 11 以後內建的系統錄影功能可以錄音,但那是另一支程式。它自己說明寫的單次錄影預設值與上限都是 180 秒;有些版本放得更寬,而當裝置拒絕時,你看到的是裝置自己的話。受 DRM 保護的影片會錄成一片黑,因為合成器不會把那些畫格交給編碼器——和截圖變全黑同一個原因。畫格尺寸在開始錄影時就固定,中途轉動手機,後面就會有黑邊。還有,隨便給一個 --size 是請求而不是保證:AVC 編碼器可以拒絕它不支援的解析度,所以這裡提供的尺寸都是編碼器大致都會接受的那些。
這頁的兩半都不能取代拿在手上的實機。鏡像會加上你在音樂遊戲裡感覺得到的延遲,而用 4 Mbps 錄出來的影片,會在快速動作上出現螢幕上本來沒有的壓縮雜訊。它們兩個真正擅長的是:把發生過的事原樣給另一個人看。從這裡可以去 logcat 檢視器,看擷取當時手機在說什麼;去系統監測頁看那段時間 CPU 和溫度在做什麼;Web ADB 首頁有其餘的工具。
USB 連線正常的話是幾十毫秒——手機編碼、傳輸、在這裡解碼並畫出來——這對示範、教學、把 app 點過去都夠用,對「時間點本身就是重點」的用途就不夠。這個數字取決於手機的編碼器、線材,以及你機器有多忙,而且不是這頁從瀏覽器這端修得掉的東西。如果你需要精確到畫格的時間,那就錄影:錄影是在手機上、以手機自己的步調做出來的,延遲就不再是問題。
操作是 scrcpy 協定的一部分,這裡也接好了:鏡像在跑的時候,你在 canvas 上的點擊和按鍵會送回裝置。也要知道它不是什麼:它不是網際網路上的遠端存取,也不是 root——輸入是由擷取畫面的同一個 `shell` 使用者 server 注入的,所以 shell 做不到的事,在這裡一樣做不到。錄影本質上是單向的,檔案在寫的時候沒有什麼可以操作。
`screenrecord` 自己說明寫的單次錄影預設值與上限都是 180 秒,所以這頁提供的上限就是它。有些版本把它放寬了,而如果你的裝置拒絕某個數值,你看到的會是裝置自己的訊息,不是我們的猜測。另一個要記得的限制是大小:用預設的 20 Mbps,三分鐘大約 450 MB,面板會在你開始之前先寫出這組設定的上限,因為在檔案複製到你的磁碟之前,抱著它的是手機自己的儲存空間。
有兩個各自獨立的原因,而這頁會告訴你是哪一個。鏡像需要 WebCodecs 的硬體 H.264 解碼,桌面 Chromium 系有、Firefox 和 Safari 沒有;沒有的話,軟體解碼跟不上手機畫面,所以這頁會說不行,而不是給你一個一直卡的黑視窗。鏡像還需要 scrcpy 的 server 執行檔,而這個版本沒有內建它;缺的時候這頁就照實說。錄影不依賴這兩件事,它只需要 File System Access API 把檔案串流寫到你的磁碟。
裝置儀表板、shell 抽屜,以及其他所有 Web ADB 工具。
一邊重現你要錄的狀況,一邊看 log。
錄的那段時間裡,手機的 CPU 和溫度在做什麼。