2015年3月15日 星期日

手機變身實物投影機

android 實物投影機 (因為 lag 造成遞迴效果) 搭配視聽教室的單槍投影機或是電腦教室的廣播系統以及一條 usb 傳輸線, Android 手機不需要安裝任何 app, 它就是一部實物投影機。 請生物及地科老師呼籲學校把電腦改安裝 linux 作業系統。 或至少用 extlinux 開機管理員 讓阿貴版 finnix 變成一開機選項之一: 只佔 300MB、 不需要重新切割硬碟、 可與 windows 共存於同一分割。 其實這個功能也可以用於手機螢幕上任何靜態內容的公開展示。 (例如爆料 line 訊息的記者會)

[2018/3/24 改推薦: scrcpy 透過 adb 把手機投影到電腦上, 連影片也能看!]

首先, 你的電腦上需要一個可以 「隨著圖檔內容動態改變而不斷更新畫面」 的看圖工具, 例如 geeqie 或 feh。 其次請設定好 連線傳檔必備工具 adb。 再來, 請在手機上建立一個工作目錄: adb shell mkdir /sdcard/tmp 等一下我們的暫存檔要放在這裡。

先下 adb shell screencap -h 查看 screencap 指令的選項。 help 訊息說它會根據命令列上的副檔名將手機畫面存成 .png 檔 (原封不動照拍; 檔案大、速度慢) 或 .jpg 檔 (幾乎無感的細微失真; 檔案小、速度快)。 注意: 有些手機只能產生 .png 檔?

隨便打開一個 app, 抓一張畫面快照來測試看看:

adb shell screencap -j /sdcard/tmp/android-screen.jpg
adb pull /sdcard/tmp/android-screen.jpg

再下: geeqie android-screen.jpgfeh -R 1 android-screen.jpg 查看圖片。 有些機器可能只支援 png 格式, 指令要改成: adb shell screencap -p /sdcard/tmp/android-screen.png

現在可以把手機開到相機模式, 對著一片樹頁、 一塊石頭、 蝴蝶標本、 你的鼻孔、 ... 任何特寫的對象, 搭配單槍投影機, 你的手機已經變身成實物投影機了!

在 android 4.x 以前, 可以不要暫存檔, 一個指令直接傳回電腦, 但需要串 sed 指令把手機傳出來的 dos 換列字元刪掉。 詳見 這篇中文 這篇英文。 但我換了手機、 刷了 cm 12 (相當於 android 5) 之後, 透過 adb shell 傳來的 png 檔 (不論有沒有用 sed 整修) 一直都是爛掉的。 所以建議還是如上一節先在手機存檔、 再用 adb pull 傳回電腦, 這樣不論新舊版本 android 都適用。

不斷按 「上箭頭、 Enter」 重複下指令有點煩。 開另一個命令列分頁, 用無窮迴圈重複地更新螢幕快照: while true ; do adb shell screencap -j /sdcard/tmp/android-screen.jpg ; adb pull /sdcard/tmp/android-screen.jpg ; date +%T ; read ; done (如果你的手機抓快照只支援 png 格式, 就要把 -j 改成 -p, 把所有 .jpg 附檔名改成 .png 。) 現在每按一個 enter, 就會抓一次手機的螢幕快照, 然後命令列上會印出更新完成時間; 而看圖軟體的畫面也會自動更新一次。 這樣當然無法看連續動作; 但是接上單槍投影機、 廣播老師的手機畫面, 或作為實物投影機, 已經很足夠。

你也可以把上面的 「read」 刪掉, 它就會連續更新。 不過如果採用 .png 格式, 又是較舊的手機, 會花好幾秒才更新一次, 效果並沒有比較好。

如果嫌 usb 線很麻煩的話, 也可以 用 wifi 連線。 有一些資安風險就是了。

其實用 「android 實物投影機」 會看到早就有很多老師這麼做 -- 只要裝一個 IPcam 即可。 貴哥的方法, 手機端不必安裝任何 app, 特別適合那些跟我一樣 「只願意從 f-droid 安裝 app」的朋友。

現在我有點想去敗一個 手機架 來玩了...

3 則留言:

  1. 這可以用命令打開相機喔:
    adb shell "am start -a android.media.action.IMAGE_CAPTURE"

    回覆刪除
  2. 然後用這個對焦:
    adb shell "input keyevent KEYCODE_FOCUS"

    回覆刪除
  3. ./adb shell "am start -a android.media.action.IMAGE_CAPTURE";
    sleep 2;
    j=0;
    for (( i=1; i<=30; i=i+1 ))
    do
    ./adb shell screencap -p | sed 's/\r$//' > screen.png;
    gpicview screen.png &
    sleep 0.5;
    [ "$j" != "0" ] && kill $j;
    j=$!;
    done

    回覆刪除

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