好々爺の電脳遊戯録

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

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

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

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

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

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

など、色々面倒らしい。


自分としては、

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

1番目に関しては、カスタムサムネイル - WhiteBrowser @WIKI - atwiki(アットウィキ) のサンプルバッチファイルを弄れば十分そう。
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の仕様)


サムネイル作成ができない時画像が生成されない場合の対処

(2023/10/05 補足)
サムネイル画像自体が生成されない場合の対処であり、画像自体は生成されているが中身が破綻している場合(ヘンテコな画像になる)は別の話である。
(2023/10/05 補足ここまで)

先に書いておくが、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 での処理は諦めて他の方法を考えましょう。


(2023/10/05 追記)

サムネイル画像が生成されない場合、コマンドプロンプトやWindowsTerminal上で ffprobe.exe を実行し出力内容を確認する。
もし、バッチファイル側が想定していない形式や異なる場所に width、height、duration に相当する情報があるならば、それらを取り出すようバッチファイルを書き直す。
一例として、mkvMatroska Video File)の場合を記事末尾へ記載する。


サムネイル画像が作成されるが、破綻している場合(2023/10/05追記)

バッチファイルでサムネイル画像は生成されるが、ヘンテコな画像(全体が灰色で所々に輪郭線や赤緑青の点が混じる等)になる場合。
ffmpegWindows用バイナリに含まれる ffplay.exe で、その動画を再生してみる。
再生したとき、ヘンテコな映像にしかならないのなら、元の動画(の情報)が壊れている可能性が高い。
(あるいは、ffmpeg がその動画コーデックに対応していない可能性がある。)
もし、ffplay.exe の引数を弄って適切な映像が得られるなら、バッチファイル内の ffprobe.exeffmpeg.exe の引数を書き換えると適切なサムネイル画像が作成できるかもしれない。
(2023/10/05追記ここまで)


バッチファイル本体

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

MKV用バッチファイル本体(2023/10/05 追記)

REM mkv.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 -of csv=p=0 >ffprobe.csv

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

ffprobe.exe -v error -i "%~s1" -select_streams v:0 -show_streams >ffprobe.csv

for /F "usebackq tokens=1,2 delims==" %%i in (
  `findstr /B "TAG:DURATION" ffprobe.csv` ) do (
    echo ffprobe execute 2nd>>timestamp.txt
    set duration=%%j
)

echo Widht: %width%>>timestamp.txt
echo Height: %height%>>timestamp.txt

setlocal EnableDelayedExpansion
set tmp=0
for /F "usebackq tokens=1,2,3,4 delims=:." %%A in ( `echo %%duration%%` ) do (
  set /a HH=1%%A%%-100
  set /a MM=1%%B%%-100
  set /a SS=1%%C%%-100
  echo hh: !HH!>>timestamp.txt
  echo mm: !MM!>>timestamp.txt
  echo ss: !SS!>>timestamp.txt
  set /A tmp=!HH!*3600+!MM!*60+!SS!
)
set /A duration=%tmp
setlocal DisableDelayedExpansion
echo Duration: %duration%>>timestamp.txt

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