2018年3月24日 星期六

scrcpy 透過 adb 把手機投影到電腦上, 連影片也能看!

scrcpy 從電腦上看手機播影片 [2024/9/22] 有一段時間, 在 debian 系列的系統上 (例如 linux mint 20 ulyana) 直接 apt install scrcpy 就裝好了, 什麼編譯通通不需要。 但是後來較新的 debian 裡面就找不到 debian 套件了。 現在我改用 ScreenStream。 以下關於 scrcpy 的資訊可能已經過時。

先前寫過 用 adb 把手機變身實物投影機, 那招不需要安裝任何軟體, 但只能秀出靜態的手機畫面快照。 最近發現 scrcpy 連手機上播放影片, 電腦都可以跟得上、 即時顯示, 對老師上課示範 android 手機/平板操作來說真是太方便了!

除了要先幫電腦與手機設定 adb 連線 之外, 最終執行時只需要兩個檔案: 在電腦上的 scrcpy 執行檔, 以及會被它透過 adb 傳到手機上的 srcpy-server.jar (算是在手機上跑的伺服器)。 也就是說, 不需要在手機上安裝 apk。 手機也不需要 root。 p>以下測試環境, 電腦是 lubuntu 17.10, 手機是 Asus Zenfone 2 跑 cyanogenmod 12.1 (android 5.1.1)。

  1. 手機必須是 android 5.0 或以上的版本才能用。
  2. 請先確認你的電腦可以用 adb 連進手機。
  3. 安裝一些相依套件: sudo apt-get install ffmpeg libsdl2-2.0.0 make gcc pkg-config meson ninja-build pkg-config libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev
  4. 到官網下載程式碼: git clone https://github.com/Genymobile/scrcpy.git
  5. 省略 「編譯伺服器」 的步驟, 直接從 官網發行版本 下載 scrcpy-server-v1.1.jar 。
  6. 進入 scrcpy 子目錄, 然後:
    meson x --buildtype release --strip -Db_lto=true -Dprebuilt_server=/路徑/scrcpy-server-版本.jar
    cd x
    ninja
    
  7. 最後用 sudo ninja install 把兩個檔案安裝到系統裡。 (僅 40k 大小 的 /usr/local/bin/scrcpy 還有僅 20k 大小的 /usr/local/share/scrcpy/scrcpy-server.jar)

然後只要下 scrcp, 就會看到手機的畫面了。 如果你的手機第一次透過 adb 遇見這部電腦, 必須先在手機上按 「允許」 之類的, 授權這部電腦操作你的手機, 第二次連線之後才會成功。 找一部 youtube 影片放來測試看看吧! 還可以旋轉九十度橫著看, 它的視窗方向也會跟著轉哦!

拿低解析度的舊電腦螢幕去看高解析度的新手機, 可能會出現類似這樣的訊息:

INFO: Initial texture: 1312x2560
CRITICAL: Could not create texture: Texture dimensions are limited to 2048x2048
ERROR: Could not open video stream

這時可用 scrcpy -m 2048 或甚至更小的數字, 表示採用較低的解析度, 那就可以顯示了。 詳見 scrcpy -h 的說明。

從原始碼 src/app/scrcpy.c 以及胡亂測試發現以下操作方式:

  1. 滑鼠左鍵: 點選/進入
  2. 滑鼠右鍵或 Esc 鍵: 上一頁/退出
  3. 滑鼠中鍵: Home
  4. 按著滑鼠左鍵滑動相當於手指滑螢幕。
  5. 閱讀時, 也可以用鍵盤上的上下箭頭、 PgUp PgDown 或滑鼠滾輪翻頁。

在文字輸入的場合, 可以直接用電腦的鍵盤。 甚至還可以從電腦上把英文複製 (ctrl-C) 貼上 (ctrl-V) 到手機上。 但沒找到如何製造 「長按手機」 的效果, 所以無法從手機複製再貼到電腦上。 還有, 中文當然也不能剪貼, 不過只要在手機上切到 google 注音, 就可以直接按電腦的鍵盤打中文了 (在電腦裡不要切換到中文模式, 直接按ㄅㄆㄇ的對應英文鍵)。 也就是說, 手機打字太慢的長輩們 (例如我) 可以用 scrcpy 部分取代 adb 傳簡訊 的功能 -- 只適用於英文內容或使用注音輸入法人士。 幾近完美, 不再苛求!

ps. 插圖動態 gif 檔產生方式: 先用 gtk-recordmydesktop 錄影桌面, 再用 ffmpeg -i out.ogv -vf scale=400:-1 -ss 4 -t 8 scrcpy.gif 轉檔。

5 則留言:

  1. meson 需要 >=0.37。一般Ubuntu 16.04 LTS 現在只到0.29 ,最後使用pip3 install meson 來取得最新版本。

    回覆刪除
  2. 非常棒的工具! Build步驟針對各平台寫得很詳盡
    https://github.com/Genymobile/scrcpy/blob/master/BUILD.md

    回覆刪除
  3. 要用電腦操作 android 還真困難……。幾款能在 anrdoid 上的 vnc server 要嘛沒維護了,要嘛付費。 chrome cast 在 linux 上的實作還有點問題。以前的 android screen monitor 現在好像也不能用了。最後找到這個要自己 build 的 scrcpy 。

    回覆刪除
  4. 那張 gif 竟然只要 2 MB。我以前從來不把 gif 當作一回事,不過我現在慢慢知道,不要太對特定的科技產生熱愛,解決問題的方法才是永遠都會用到的道理。

    gif 的確在某些情況下能攜帶更多資訊,大大幫助閱讀者的理解能力,像是 command line (terminal) 的操作片段,如果全部用文字呈現,可能會要看一段時間,但是用 gif,秒懂,然後又夠精簡。

    fps 可以降到很低很低,比如這個網址的第 2 張 gif:
    https://www.screentogif.com/screenshots.html
    竟然只要 20KB.

    回覆刪除
  5. 我跑 ninja install 報錯找不到 jar 命令,好像要裝 openjdk 。
    就算已經有編好的 server.jar 了,還是會指定需要 `jar` 命令。
    這應該是 meson.build 沒寫好吧?

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。