Edited at

コマンド一発でAndroidの画面を録画してGIFを作成する

2019年7月追記

意外とみんな困ってそうなので3年ぶりにアップデート

余計かもしれませんが ずっと使っていて便利だったので、Slackまでそのまま上げられるようにするコマンドも追加しておきます。

YOUR_PATH に保存先

スクリプトはgit管理していて公開しているので、Slackのtokenは YOUR_SLACK_TOKEN を環境変数としてtoken.confに定義しています。

パスが個人的なものになっているので、

消すなりgit管理してない人は直接token書いてしまっても良いと思います。

gifサイズは大きくなりがちなので、ffmpegのオプションで scale=iw*2/3:ih*2/3 とかを変えてあげるとサイズが割と小さくなります。

経験則では画質を下げてもそこまで容量が下がらない&&荒くなるので 動画のサイズを小さくした方がいいです。

端末そのままのサイズで録画されるので、最近の端末だとoriginalサイズは4kとかになったりする

↑ 追記文


デザイナーやチームの他のメンバーの人と、

どんな動きをするのか等 UI/UXのやり取りをする際に

GIFを作成してslack等に送りたい時が多々あるのですが、

録画して...変換して...とやっていると中々手間だったりします。

コマンド一発で接続している端末の録画をし、

とりあえずデスクトップに動画とGIFを保存するスクリプトを書きました。

YOUR_PATHの箇所を変更すれば、好きな場所に保存されます。

スクリーンショット バージョンはこちら


環境


  • 今回はOSXでbash使ってます

  • adbのpathが通っている前提

  • GIF変換までする方はffmpegをインストールしておいて下さい mac(brew) -> brew install ffmpeg

  • Androidの端末バージョンは4.4以上


Script

以下のスクリプトを作成します


adb-screen-record.sh

#!/bin/sh

DATE=`date '+%y%m%d%H%M%S'`
FILE_NAME=record-${DATE}
YOUR_PATH=~/Desktop

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR # move script directory
source ../token.conf # gitに上げないように slackのtokenは別管理
SLACK_TOKEN=$YOUR_SLACK_TOKEN

adb shell screenrecord /sdcard/${FILE_NAME}.mp4 &
pid=`ps x | grep -v grep | grep "adb shell screenrecord" | awk '{ print $1 }'`

if [ -z "$pid" ]; then
printf "Not running a screenrecord."
exit 1
fi

printf "Recording... finish? [y]"
while read isFinished; do
case
"$isFinished" in
"y" | "Y") break ;;
*) printf "Incorrect value." ;;
esac
done

kill -9 $pid # Finish the process of adb screenrecord

while :
do
alive=`adb shell ps | grep screenrecord | grep -v grep | awk '{ print $9 }'`
if [ -z "$alive" ]; then
break
fi
done

printf "Finish the recording process : $pid\nSending to $YOUR_PATH...\n"

adb pull /sdcard/${FILE_NAME}.mp4 $YOUR_PATH
adb shell rm /sdcard/${FILE_NAME}.mp4

echo "Convert to GIF? [y]"
read convertGif
case $convertGif in
"y" | "Y") ffmpeg -i ${YOUR_PATH}/${FILE_NAME}.mp4 -an -r 12 -pix_fmt rgb24 -vf scale=iw*2/3:ih*2/3 -f gif ${YOUR_PATH}/${FILE_NAME}.gif # creating gif
;;
*) ;;
esac

echo "Upload to slack? [y]"
read isUpload
case $isUpload in
"y" | "Y") ;;
*) exit 0;;
esac

echo "Input channel name : "
read channelName

curl -XPOST -F "token=$SLACK_TOKEN" -F "channels=#$channelName" -F "file=@${YOUR_PATH}/${FILE_NAME}.gif" -F "filename=${FILE_NAME}.gif" "https://slack.com/api/files.upload"


録画はyを入力すると終了します。

その後、yを押すとGIFへ変換されます。

他のボタンを押すと終了します。

このスクリプトを任意の場所に保存し、

.bash_profile等にpathを書いておけば

任意の場所から adb-screen-record.shのコマンド一発で

デスクトップに変換・保存されます。

adb screenrecordの制約で録画時間は3分までになっています。

今回はデフォルトの値を利用してますが、録画サイズなどを指定したい場合はこちらを見てパラメーターを設定して下さい。

GIF変換のオプションを変更する場合はこちらを見て下さい。

screenrecordを終了してすぐに送信するとエラーが起きるので

sleep 3としましたが、他に何か良い方法がありましたら教えて下さい。

-> @aremokoremoさんに教えていただいた方法を追記しています