Akira's Tech Notes

Java/JVM | GNU/Linux | Emacs/Lisp | 知的好奇心駆動

header-icon
ネイティブでない日本語で思い付くことや気になることをダラダラ書く、体裁とかは気にしない。読みづらいと感じた時に随時更新する。

[メモ]ffmpegでスクリンキャストを取る

ffmpegxwininfo コマンドでスクリンキャストを取るシェールスクリプトを作成してみた。

1 特定のウィンドウを録画する

第一引数に録画ビデオファイルの保存パスを指定する。

#!/bin/sh

###########################################################################
# fsc-window.sh - take screen video cast for selected window
#
#    Authors: Luo Zengbin <jalen.cn@gmail.com>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Usage:
#    $fsc-window.sh $1 第一引数に録画ビデオファイルの保存パスを指定する。
###########################################################################

####################################
# 奇数を偶数に変換する処理
####################################
function even_round {
    if [ `expr $1 % 2` == 0 ]; then
        echo $1
    else
        echo $(($1 - 1))
    fi
}

echo "録画対象Windowをカーソルで選択してください。"
VFILE=$1
INFO=$(xwininfo -frame)

WIN_GEO=$(echo $INFO | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')
WIN_XY=$(echo $INFO | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )

# Windowsの横サイズと縦サイズを偶数にする
WIN_GEO_X=$(echo $WIN_GEO | cut -d 'x' -f 1)
WIN_GEO_Y=$(echo $WIN_GEO | cut -d 'x' -f 2)

WIN_GEO="$(even_round $WIN_GEO_X)x$(even_round $WIN_GEO_Y)"

echo "画面サイズ:$WIN_GEO"
echo "画面位置  :$WIN_XY"

# 録画開始
ffmpeg -show_region 1 -f x11grab -framerate 25 -video_size $WIN_GEO -i :0.0+$WIN_XY \
       -dcodec copy -pix_fmt yuv420p -c:v libx264 -preset veryfast -qscale 1 -y $VFILE

ハマッたところ

  • ビデオの横と縦のサイズを偶数にしないと、iphoneで再生時に真っグリンな画面しか見れない
  • shell関数の戻り値は return じゃなくて、 echo を使うべき。 return はプロセスの 実行結果ステータスと同じ使い方、ステータスを示すに使う

コマンドの便利なオプション

  • xwininfo -frame 対象のウィンドウをカーソルで選択できるオプション
  • ffmpeg -show_region 1 録画対象範囲を点線で囲んで分かりやすくするオプション、1は点 線の太さを示す

2 全画面を録画する

xwininfo -root でフルスクリーンの情報を取得することができます。

#!/bin/sh

###########################################################################
# fsc-full.sh - take full screen video cast
#
#    Authors: Luo Zengbin <jalen.cn@gmail.com>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Usage:
#    $fsc-full.sh $1 第一引数に録画ビデオファイルの保存パスを指定する。
###########################################################################

WIN_GEO=$(xwininfo -root | grep 'geometry' | awk '{print $2;}' | cut -d '+' -f 1)

# 録画開始
ffmpeg -show_region 1 -f x11grab -framerate 25 -video_size $WIN_GEO -i :0.0 \
       -dcodec copy -pix_fmt yuv420p -c:v libx264 -preset veryfast -qscale 1 -y $1

3 録画サンプル

録画テストサンプル

ばっちりだね。 めでたしめでたし。

Comments