1. 程式人生 > >一鍵生成 Android 錄屏 gif 的指令碼

一鍵生成 Android 錄屏 gif 的指令碼

目的

編寫 bash 指令碼, 實現一行命令得到 Android 手機錄製螢幕 gif 動圖檔案.

博主使用 ubuntu 系統, shell 為 bash. 這個指令碼也可以用在 mac 系統上.
聽說 windows 系統出了 ubuntu on windows, 不知道能不能使用這個指令碼.

原理

adb shell screenrecord

Android 4.4 版本後系統內預置了一個 screenrecord 命令, 可以用來將螢幕錄製為 MP4 格式. 具體命令格式可以通過 –help 引數檢視:

$ adb shell screenrecord --help
Usage: screenrecord [options] <filename>

Android screenrecord v1.2.  Records the device's display to a .mp4 file.

Options:
--size WIDTHxHEIGHT
    Set the video size, e.g. "1280x720".  Default is the device's main
    display resolution (if supported), 1280x720 if not.  For best results,
    use a size supported by the AVC encoder.
--bit-rate RATE
    Set the video bit rate, in bits per second.  Value may be specified as
    bits or megabits, e.g. '4000000' is equivalent to '4M'.  Default 4Mbps.
--bugreport
    Add additional information, such as a timestamp overlay, that is helpful
    in videos captured to illustrate bugs.
--time-limit TIME
    Set the maximum recording time, in seconds.  Default / maximum is 180.
--verbose
    Display interesting information on stdout.
--help
    Show this message.

Recording continues until Ctrl-C is hit or the time limit is reached.

舉例:

adb shell screenrecord --size "360x640" --bit-rate 2000000 /sdcard/android_screenrecord_test.mp4

上面的命令將把所連線的手機螢幕錄製為 寬高 360x640, 位元率 2M 的視訊, 儲存為手機 sd 卡根目錄下的 android_screenrecord_test.mp4 檔案.
該命令會持續錄製, 直到用 ctrl-c 終止命令, 那麼錄製也就結束了.
也可以用 –time-limit TIME 引數來預先指定錄製時長, 到時間會自動結束. 預設的最大時長為 3 分鐘.

ffmpeg

使用 ffmpeg 抽幀的命令將視訊提取為一系列圖片:

ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.jpg'

其中: -r 5 代表抽取的幀率, 即每秒視訊抽取 5 幀出來.

convert

使用 imagemagick 包中的 convert 命令將一系列圖片組合為 gif 動圖格式:

convert -delay 20 -loop 0 *.jpg myimage.gif

其中: -delay 20 代表所生成的 gif 動圖每幀之間的時間間隔, 即每 0.2 秒顯示下一幀.

如果系統內還沒有 convert 命令, 可以用如下命令安裝:
sudo apt-get install imagemagick


博主使用 ubuntu 16.10, 這個命令是預置在系統裡的, 不需要安裝.

ffmpeg 及 convert 引數設定

上面兩個命令中, ffmpeg -r 5convert -delay 20 這兩個引數值, 分別是 視訊抽幀間隔 和 gif每幀間隔, 假設其分別為 video_fps 和 gif_delay, 那麼這兩個引數在設定時必須滿足如下條件:
video_fps * gif_delay = 100

如果乘積小於 100, 則生成的 gif 會比原本的播放速度快;
如果乘積大於 100, 則生成的 gif 會比原本的播放速度慢.

至於原因, 結合上面對這兩個引數的介紹, 思考一下就明白了.

捕獲錄製結束事件

上面三個命令分開呼叫, 實現錄屏為 gif 已經相當簡單了.
如果要將三條命令寫在一個腳本里, 在一個過程中完成功能, 第一個要解決的是如何捕獲錄製結束事件, 即 ctrl-c 命令.
在 bash 中可以通過下面指令碼實現:

# catch ctrl-c signal
CTRL_C() {
    # ctrl-c hit, do something
}
trap CTRL_C SIGINT

有了這個方法獲取錄製結束事件, 再往下就簡單了.
這裡遇到一個坑, 就是如果捕獲 ctrl-c 後直接開始轉換 gif 的操作, 會失敗. 試過幾次後, 發現是 ctrl-c 後其實 Android 的 screenrecord 命令並沒有處理完, 這時候的視訊還不可用. 解決的辦法簡單粗暴, 讓指令碼原地 sleep 2秒, 再去操作所生成的 MP4 檔案就可用了.

最終指令碼

也不知道該寫些啥了, 直接貼出完整指令碼吧:

#!/bin/bash
# author : [email protected]

#========================================================
# define param group here

QUALITY_1=("360x640"  1000000  4  25)
QUALITY_2=("360x640"  1000000  5  20)
QUALITY_3=("360x640"  1000000  10  10)
QUALITY_4=("720x1280"  1000000  4  25)
QUALITY_5=("720x1280"  1000000  5  20)

#========================================================

QUALITY=(${QUALITY_2[@]})

RESOLUTION=${QUALITY[0]}
BIT_RATE=${QUALITY[1]}
GIF_FPS=${QUALITY[2]}
GIF_DELAY=${QUALITY[3]}

# GIF_FPS and GIF_DELAY must meet the following condition:
# GIF_FPS * GIF_DELAY = 100

OUTPUT_FILE_NAME=android_screen_record.$(date +%m%d%H%M%S).gif
OUTPUT_FILE_DIR=$(pwd)
OUTPUT_VIDEO_NAME=screenrecord_$(date +%m%d%H%M%S).mp4
OUTPUT_VIDEO_DEVICE_DIR=/sdcard
TMP_DIR=/tmp/android_screen_to_gif_$(date +%m%d%H%M%S)

RECORDING=true

# you may use adb by absolute file path. if so, specify it here
ADB="adb"

#========================================================

# catch ctrl-c signal
CTRL_C() {
    if $RECORDING; then
        echo "stop recording. start convert..."
        RECORDING=false
    else
        # ctrl-c hit but not for stop recording, just exit.
        exit $?
    fi

    # adb screenrecord may still deal with mp4 file creating,
    # just wait for it a little while.
    sleep 2s
    adb pull $OUTPUT_VIDEO_DEVICE_DIR/$OUTPUT_VIDEO_NAME $TMP_DIR
    if [ -f $TMP_DIR/$OUTPUT_VIDEO_NAME ]; then
        # remove video on phone
        adb shell rm $OUTPUT_VIDEO_DEVICE_DIR/$OUTPUT_VIDEO_NAME

        echo "converting file: $TMP_DIR/$OUTPUT_VIDEO_NAME"
        MP4ToGIF $TMP_DIR/$OUTPUT_VIDEO_NAME
    else
        echo "* create screen record mp4 fail"
        exit 2
    fi
}
trap CTRL_C SIGINT

# catch script exit event
CLEAR_WORK() {
    if [ -e $TMP_DIR ]; then
        # since the tmp files have been put into /tmp/ dir, they will get
        # removed on system reboot. thus we are in no hurry to remove them now.
        # un-commit this line if you want to remove tmp files immediately after script run
        #rm $TMP_DIR
        echo
    fi
}
trap "CLEAR_WORK" EXIT

#========================================================

function MP4ToGIF() {
    echo "*** extract frames ***"
    mkdir $TMP_DIR/frames
    ffmpeg -i $1 -r $GIF_FPS "$TMP_DIR/frames/frame-%03d.jpg"
    echo "*** convert frames to gif ***"
    convert -delay $GIF_DELAY -loop 0 "$TMP_DIR/frames/*.jpg" $OUTPUT_FILE_DIR/$OUTPUT_FILE_NAME
}

#========================================================

if [ ! -d "$OUTPUT_FILE_DIR" ]; then
    echo "* output dir not exists: $OUTPUT_FILE_DIR"
    exit 1
fi
if [ ! -e $TMP_DIR ]; then
    mkdir $TMP_DIR
fi
if [ ! -e $TMP_DIR ]; then
    echo "* tmp dir not exists: $TMP_DIR"
    exit 1
fi

echo "params: $RESOLUTION, $BIT_RATE, $GIF_FPS, $GIF_DELAY"
adb shell screenrecord --verbose --size $RESOLUTION --bit-rate $BIT_RATE $OUTPUT_VIDEO_DEVICE_DIR/$OUTPUT_VIDEO_NAME

開頭定義的那幾個陣列, 是為了便於測試. 最終生成的 gif 檔案也直接儲存在了當前目錄下.
主要是因為加上引數化, 程式碼會多很多, 就不容易找到主要功能了.
帶引數化, 帶簡易幫助文件的完整指令碼, 可以在下面連結中找到:

使用

使用前提:

指令碼本身就是為了使用簡單寫的. 只需在命令列直接執行指令碼, 即可開始手機螢幕錄製. 因為是測試, 選在 /tmp 目錄操作.

$ cd /tmp/
$ android_screen2gif.sh 
params: 360x640, 1000000, 5, 20
Main display is 720x1280 @60.00fps (orientation=0)
Configuring recorder for 360x640 video/avc at 1.00Mbps
Content area is 360x640 at offset x=0 y=0

這時錄製正在進行, 命令列掛起. 等你認為錄製可以結束了, 按下 ctrl-c, 錄製結束, 開始轉換 gif 的步驟. 一般需要3到4秒, 錄屏的 gif 就在當前目錄生成了.

^Cstop recording. start convert...
[100%] /sdcard/screenrecord_0407090859.mp4
converting file: /tmp/android_screen_to_gif_0407090859/screenrecord_0407090859.mp4
*** extract frames ***
ffmpeg version 3.0.7-0ubuntu0.16.10.1 Copyright (c) 2000-2017 the FFmpeg developers
......
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/android_screen_to_gif_0407090859/screenrecord_0407090859.mp4':
......
Output #0, image2, to '/tmp/android_screen_to_gif_0407090859/frames/frame-%03d.jpg':
......
*** convert frames to gif ***
result gif file:
/tmp/android_screen_record.0407090859.gif

這一步輸出較多, 用 ...... 代替了部分輸出. 最後那行就是最終生成的 gif 錄屏檔案了.

引數建議

根據自測 及 最終 gif 生成的過程, 可以得到如下結論:

視訊解析度引數:
寬高越大越清晰, 最終生成的 gif 檔案越大. 這個是很明顯的.
最好按手機豎屏顯示的方式, 將解析度設定為 9:16 的比例. 如果設定為其他比例, 比如 480:480, 則錄製出的視訊會有很寬的黑邊.

視訊位元率引數:
先說結論: 位元率設定基本不會影響最終生成的 gif 檔案質量.
因為最終 gif 檔案來自視訊抽幀, 視訊位元率的大小對於比如每秒抽取10幀這樣的需求, 對抽取出的圖片清晰度影響不大. 因此為了中間檔案更小, 建議把這個引數設低即可.

抽幀幀率 及 每幀間隔:
這兩個引數對最終 gif 質量影響很大. 其中:
抽幀幀率越大, 最終 gif 質量越高;
每幀間隔越小, 最終 gif 質量越高.
如前述, 這兩個引數必須成對設定. 如果這兩個引數都取整數的話, 基本上可以設定的就下面這幾對:

2, 50
4, 25
5, 20
10, 10

其中:
10, 10 這組, 設定每秒10幀, gif 每幀間隔 0.1 秒, 這樣5秒的gif檔案就要大概 10M 大小了.
2, 50 這組, 設定每秒2幀, gif 每幀間隔 0.5 秒, 最終gif檔案卡頓就很嚴重了.
因此建議選取 5, 20 這組引數. 如果對gif質量要求很高, 可以試試 10, 10 這組引數.

綜上, 小夥伴們可以自己嘗試下設定不同的引數組合, 試幾次就能體會該怎麼設定了.

參考:

再次無恥的安利安利自己的指令碼專案:

相關推薦

生成 Android gif指令碼

目的 編寫 bash 指令碼, 實現一行命令得到 Android 手機錄製螢幕 gif 動圖檔案. 博主使用 ubuntu 系統, shell 為 bash. 這個指令碼也可以用在 mac 系統上. 聽說 windows 系統出了 ubuntu on wi

Idea插件開發--生成Android Mvp架構代碼

道理 一鍵生成 div script groups jdk1 git 模板 重復 記錄一下,自己寫插件的過程。這個插件是為了一鍵生成MVp代碼用的,由於是根據我們自己的項目結構來的,因此各位想直接用是不行了 伸手黨想直接用的就不用看了,有想做的可以作為參考一下 我一直覺

MAC Android Studio用android手機進行除錯並實時同步在電腦上顯示(gif體積小清晰)

第一步:Mac電腦使用Android Studio進行真機除錯 第二步:Vysor:一款連線Android裝置和Chrome的神奇工具! 第三步:翻牆(藍燈)下載Vysor chrome外掛 第四步:Vysor chrome外掛破解 1.9.3 (Mac) 破解可以顯示更高清的

Android tips(九)-->Android與轉化gif

最近有同學問我android手機的錄屏以及轉化成gif圖是如何實現的?今天正好就講講android的錄屏與轉化gif操作。整個Android系統的錄製與轉化GIF圖是分為兩個部分,錄製過程與轉化過程,下面就詳細的介紹一下這兩個部分的具體過程。 androi

Android簽名檔案keystore生成

我們都知道,Android的簽名祕鑰檔案.keystore可以通過java的keytool.exe來生成,但是隻能逐步新增資訊,那麼怎麼一鍵生成呢? 方法如下:可以寫成bat批處理(注意提前設定好j

Android國際化資原始檔生成工具,推薦給做國際化的朋友

工具起源 最近在做國際化多語言適配,由開發人員收集專案中所有顯示的文字交於專人負責整理和翻譯,翻譯完成後把整理好的Excel交給開發人員進行適配。然而並沒有這樣簡單。。。各種修改、調整、新增文字,每次修改後開發人員都得核對一次,然後各個在strings.xml中修改。可

swift指令碼程式設計:生成AppIcon

自從Xcode8之後就不支援外掛了,沒法用Xcode一鍵生成AppIcon,一直沒找到好的解決方案,一怒之下決定自己寫一個指令碼用來生成AppIcon,下面是正文,小弟拋磚引玉,有寫的不好的地方有請大佬們見諒: 原始碼地址 事前準備

2017年自媒體人必備軟件:款免安裝軟件!

錄屏軟件 優酷錄屏軟件 現在自媒體這麽火,你還沒加入的就out啦,如果你是專門發視頻的自媒體人,那麽今天有福了,PCGOGO要推薦一款功能專一,免安裝的錄屏軟件給大家。 沒錯,就是:優酷桌面錄屏!為什麽那麽多錄屏軟件不推偏偏要推薦這一款呢?我主要是看上了他免安裝,免安裝

微信小程序生成源碼 在線制作定制功能強大的微信小程序

系統 目標 團隊 時間 特點 一個人 繼續 個人 相關 微信小程序發展到現在,短短的一年不到的時間(很快就要迎來微信小程序周年慶),在快迎來周年慶之際,百牛信息技術bainiu.ltd特記錄一下這個發展的歷程,用於將來見證小程序發展的輝煌時刻,我們還能知道微信小程序除了騰訊

支持源碼多重加密,將網站生成EXE文件運行,封裝網站源碼演示運行

php整站打包工具 php網站打包成exe php網站生成exe php項目怎麽打包成exe php整站打包程序 PHP打包器應用場景:做好網站程序後,發布給用戶看,但是不想泄露源碼,可以選擇“封裝源碼生成EXE文件”,建議封裝前先用zend等加密代碼,可以起到雙重保險,對方在破解軟件的同

生成http服務器

log div python3 一個 http服務器 down pos 需求 生成 如果你想用最簡單的方法在內網共享目錄,可以考慮為要共享的目錄生成一個http服務器,這樣就可以在內網任一臺設備打開瀏覽器就可以瀏覽了。簡單舉幾個例,有了這個http服務器就可以: 在手機瀏

生成vue模板

自動打開 efi 例如 gpo djang category 勝利 選項 一個 方法: 打開VSCODE編輯器,依次選擇“文件 -> 首選項 -> 用戶代碼片段”,此時,會彈出一個搜索框,我們輸入vue, 如下: 選擇vue後,VSCODE會自動打開

想做微信小程序第三方代理,各位覺得生成平臺能賺到錢嗎?

附近 TP IT 一鍵 bsp 很多 流量 專家 價格戰 這幾年生意不景氣,這是很多人的共識。從2009年開始,各種專家就判斷“明年經濟是最差的一年。”然後,這個明年,一直“明”到了2018年,到最後,我們發現,經濟就沒好過,一年比一年差。 工廠倒閉、商店關門、電商企業倒閉

「速成應用」生成微信小程序平臺 可視化制作開發無需代碼

一鍵生成 拖拉 介紹 客服 我們 就是 微信 模式 www 經歷了頻繁的更新叠代,小程序已經構建起了趨於完善的生態,與此同時,以「速成應用」為代表的小程序第三方開發平臺也在推動著小程序市場的發展。為了更好地助力企業打造微信內電商生態閉環,實現線上線下引流,「速成應用」於近日

機械廠管理系統-下單即可計算成品庫存-生成送貨單

計算 原材料 解決 項目團隊 軟件包 管理者 進一步 多少 相關 《信華ERP生產管理軟件》V8.01行業專業版,是江門市信華軟件科技有限公司根據中小型加工生產性企業的生產標準化流程需要,而開發出的一套高效快捷、簡潔易用的ERP生產管理系統。是一款面向於員工數在20-200

機械設備生產管理軟件-機械零配件多,可進行缺料自動計算,生成采購單

功能 詳細資料 組成 異地 jpg 詳細信息 text 介紹 color 信華V8.01行業超級版適合物料組成豐富、每日訂單多的中小型生產性企業。因為該版本軟件的主要功能就是1.可設置物料bom表(生成生產單時會自動帶出並且計算缺料)2.mrp缺料自動運算(可勾選多張訂單進

生成IOS App Icon工具

div sca sdn 全部 修改 mage top pri exce 每次要提審AppStore,美術總是給一個1024x1024的 Icon ,然後就進入了繁瑣的修改圖片 size 和 plist 文件 Icon 配置的過程,很繁瑣。這些應該是可以偷懶的啊~然後就有了這

不會做抖音網紅快閃PPT?這個插件可以免費生成快閃PPT!

素材 直接 文本 lar 是什麽 class stat 輸入文本 下載 不會做抖音網紅快閃PPT?莫慌~這個插件可以免費一鍵生成快閃PPT!是什麽插件呢?就是收獲眾多好評的PA口袋動畫啦~ 1.智能動畫 制作一個簡單快閃,可以用智能動畫選項來完成。 步驟:找到智能動

黑客工具:一個Python指令碼搞定所有攻擊操作

  近期出現了可綜合利用Shodan裝置搜尋引擎和Metasploit滲透測試工具的Python程式碼。該程式碼會用Shodan.io自動搜尋有漏洞的線上裝置,隨後使用Metasploit的漏洞利用資料庫劫持計算機和其他線上裝置。      

【VBA】【天的心血,收藏一下】生成報表2

Public batch$ Sub crAddReport() '獲取窗體單選框選擇 UserForm1.Show If UserForm1.OptionButton1.Value = True Then batch = "一" ElseIf Us