毎日モザイク

White Room Layout Works

2016-02-25T07:34:20+09:00 [Thu]
--> [日常]

動画ファイルから等間隔にスクリーンショットを撮る

こちらhttp://askubuntu.com/questions/684834/need-help-with-mpv-bash-scriptのUbuntu用の回答をOSXで使う。

使うもの

bash –本体
mplayer –動画の尺とかを取る
mpv –主役
rename –無いとめんどくさい

入れるもの

home brewは入れといてください。
brew install mplayer
brew install mpv
brew install rename

使い方

下記のshで bash [下記のスクリプト] [動画ファイル] で、カレントディレクトリに等間隔に100枚撮れます。

下記のshの通り、mplayerだけでやったほうが合理的な気もしますが、mpvのほうが多少速いので、どうせ見えないなら速いほうがいいということでmvp。

エロ関係では非常に便利……でもない。速いし便利そうなんですが、動画も音声も一切の表示をせずにスクリーンショットを撮るので、見せたいカットが撮れている保証は全く無くありません。

もっと細かく割れば…。後からのセレクトの手間を考えると動画を見ながらスクリーンショットをとったほうが早い。

36枚撮りのポジでエロビデオ3本分を撮るのに2000円くらいかかっていた時代に、1本を12コマ(1コマ目はタイトルカット)にまとめる仕事で鍛えぬいたので、見ながら撮る作業は余裕ですし。

使いみちとしては、大雑把なカタログ的なものにしか使えません。

使い所が今ひとつありませんが、OSXで自動で大雑把な静止画リストを作りたいとかいうことが年に1回位はあるので、動いたところでメモ。

#!/usr/bin/env bash

### Global variables
filename="$1"

### Error handling
if [ -z "${filename}" ];
then
    echo "ERROR: No video file supplied. Please enter a video file as argument."
    exit 1;
fi

NUM_OF_SCREENSHOTS=100 ## 枚数

if [ ! -z "$2" ]; 
then
    NUM_OF_SCREENSHOTS=$2
    echo "WARNING: Overwrite default number of screenshots to ${NUM_OF_SCREENSHOTS}."
    sleep 3s
fi

# Get the total length of the video in seconds.
#  Use mplayer to display the info of the video and then get the value of ID_LENGTH, the total number of seconds of the video.
# 訳)Mplayerを使って、動画ファイルの尺を測るよ。

total_length=$(mplayer -identify -frames 0 -vc null -vo null -ao null "$filename" | grep ID_LENGTH | sed 's/ID_LENGTH=//' | sed 's/\..*//')

# Reference https://github.com/mpv-player/mpv/blob/master/TOOLS/mpv_identify.sh

# Remove 4 seconds from the video so that it doesn't take screenshot at the ends.
# 末尾から4秒端折るよ
let total_length-=4

# time_slice: At which time interval should mplayer take screenshots.
# 間隔を決めるよ
let time_slice=${total_length}/${NUM_OF_SCREENSHOTS}

# time_at: When should mplayer take screenshots.
time_at=${time_slice};

# Looping to take screenshots.
# 等間隔スクリーンショット開始
for ((i=1; i <= NUM_OF_SCREENSHOTS ; i++))
do

    # Take the screenshot.
    #mplayer -loop 1 -nosound -frames 1 -ss ${time_at} -vo png:z=9 ${filename} #mplayerの人はこっち
    mpv --quiet --no-audio --vo=image --start=${time_at} --frames=1 "$filename" #mpvの人はこっち
    rename 's/^[0-9]+/out'"${time_at}"'/' 00000001.jpg

    # Increment to the next time slice.
    let time_at+=${time_slice}

done

exit 0