好々爺の電脳遊戯録

PCゲームに関してプレイ日記(ログ)やmod、周辺ツールのことなど書いていこうかな、と。

古の白ブラウザでサムネイルを作らせたかっただけ

ゲーム動画など、貯まった動画を管理したくなり。
古のWhiteBrowser を引っ張り出して登録してみた。

案の定、素のWindows10では、サムネイルは作れない。
昨今の動画は、H.264+AAC
WhiteBrowser が前提とする DirectShow Filter では素のままでは扱えない。

定番の回避策は、DirectShow Filter詰め込みパックの定番アプリをWindows環境にインストールする方法。
しかし、情報を集めた感じだと、

  • WindowsUpdateでインストールし直しが必要な時がある。
  • 上手く行かないこともある

など、色々面倒らしい。


自分としては、

  1. 適当なサムネイルで動画の中身を確認できればいい。
    (ピンポイントでサムネイル指定とかは必要無い)
  2. 余計なアプリのインストールは極力避けたい。

1番目に関しては、カスタムサムネイル - WhiteBrowser @WIKI - アットウィキ のサンプルバッチファイルを弄れば十分そう。
2番目に関しては、定番ツールの ffmpeg が、今は (準)公式なWindowsバイナリ も配布されていて、バイナリファイルを好きに置けばいいだけだから管理も楽。

自分の用途で扱う分にはサンプルバッチファイルで十分。
そんなわけで、ffmpeg を使うようにバッチファイルを書き換えてみた。


準備作業

  1. FFmpeg のオフィシャルサイトから、Windows用バイナリ(32bit/64bit)をダウンロードする。
    (Windows10が、64bit なら64bitでよい。)
  2. ダウンロードしたファイルを展開後、ffmpeg.exeffprobe.exeWhiteBrowserのインストールフォルダ にコピーする。
    (あるいは、配下に「bin」フォルダを作成し、そこにコピーする)
  3. サムネイルを作りたい動画ファイルの拡張子 xxx に併せて、バッチファイル名を xxx.bat で保存し、WhiteBrowserのインストールフォルダにコピーする。
    (バッチファイルの編集・保存に、メモ帳は使わないこと。他のテキストエディタで"ShiftJIS+CRLF"で保存する)

なお、 all.bat にはしないこと!

また、バッチファイルのファイル名は、サムネイル作成を行いたい拡張子にすればよい。
そのため、サムネイル作成に失敗する動画だけ 拡張子 yyy に変えておき、yyy.bat を作って作成させる、という方法も取れる。
(拡張子とアプリの対応が切れるのを気にしなければ、という前提)

なお、このバッチファイルは、等間隔サムネイルとランダムサムネイル、全サムネイルの再作成に使われる。
(WhiteBrowserの仕様)


サムネイル作成ができない時

先に書いておくが、DRM付き動画は無理。(だと思う)
それ以外の動画で、動画再生プレイヤーで再生できるが、バッチファイルでの処理でもサムネイルが作成されない場合。

そんなときは、バッチファイル中ほどにある以下の部分を書き換える。

del ffprobe.csv
del timestamp.txt

これを

REM del ffprobe.csv
REM del timestamp.txt

にする。

再度サムネイル作成を行い、WhiteBrowserのインストールフォルダ/temp配下にある

ffprobe.csv
timestamp.txt

を確認する。

以下の二点が、ffmpeg で処理できているかどうかのヒントになる。

  • ffprobe.csvカンマ区切りで数字が3つあるか?(width,height,duration の順)
  • timestamp.txttemp.jpgがあるか?(ffmpeg.exeで抽出した画像ファイル)

ffprobe.csvの方は、動画情報を ffmgeg が取得できているかの判別。
timestamp.txtの方は、ffmpeg が動画ファイルの再生ができているかの判別。

ffprobe で情報を取れなければ、ffmpeg での処理は諦めて他の方法を考えましょう。


バッチファイル本体

REM xxx.bat
REM 以下の何れかに ffmpeg.exe と ffprobe.exe を置いておく
REM - WhiteBrowserのインストールフォルダ直下
REM - WhiteBrowserのインストールフォルダ\bin (binフォルダを作る)

@echo off
set path=%~dp0;%~dp0bin;%path%
cd /d %~dp2

del timestamp.txt
del ffprobe.csv
echo Src: %1%>>timestamp.txt
echo Out: %2%>>timestamp.txt
echo Pics: %3%>>timestamp.txt
echo Seek: %4%>>timestamp.txt

ffprobe.exe -v error -i "%~s1" -select_streams v:0 -show_entries stream=width,height,duration -of csv=p=0 >ffprobe.csv

for /F "usebackq tokens=1-3 delims=," %%A in ( ffprobe.csv ) do (
    echo ffprobe execute>>timestamp.txt
    set /a width=%%A
    set /a height=%%B
    set duration=%%C
)
echo Widht: %width%>>timestamp.txt
echo Height: %height%>>timestamp.txt
echo Duration: %duration%>>timestamp.txt

for /F "usebackq tokens=1 delims=." %%A in ( `echo %%duration%%` ) do set /a duration=%%A
REM if not defined duration ()
REM if not defined width ()
REM if not defined height ()

echo Total %duration% Sec>>timestamp.txt
set /a endcount=%3-1
for /l %%C in (0,1,%endcount%) do call :yyy %1 %2 %3 %4 %%C
for %%i in (*.jpg) do (
  echo %%i>>timestamp.txt
)
REM デバック用に参照する場合は以下2行冒頭を REM
del ffprobe.csv
del timestamp.txt
goto :eof

:yyy
if "%4" == "normal" set /a ss=%duration%*(%5*2+1)/(%3*2+2)
if "%4" == "random" set /a ss=%duration%*%random%/32767
ffmpeg.exe -y -ss %ss% -i "%~s1" -vframes 1 -f image2 temp.jpg

if %3 gtr 1 (set count=_%5)
ren temp.jpg %~n2%count%.jpg
wbtc -s 0 %ss% %~n2%count%.jpg
echo Thumb_%5_name: %~n2%count%.jpg>>timestamp.txt
echo Thumb_%5_%ss%>>timestamp.txt
goto :eof