古の白ブラウザでサムネイルを作らせたかっただけ
ゲーム動画など、貯まった動画を管理したくなり。
古のWhiteBrowser を引っ張り出して登録してみた。
案の定、素のWindows10では、サムネイルは作れない。
昨今の動画は、H.264+AAC 。
WhiteBrowser が前提とする DirectShow Filter では素のままでは扱えない。
定番の回避策は、DirectShow Filter詰め込みパックの定番アプリをWindows環境にインストールする方法。
しかし、情報を集めた感じだと、
- WindowsUpdateでインストールし直しが必要な時がある。
- 上手く行かないこともある
など、色々面倒らしい。
自分としては、
- 適当なサムネイルで動画の中身を確認できればいい。
(ピンポイントでサムネイル指定とかは必要無い) - 余計なアプリのインストールは極力避けたい。
1番目に関しては、カスタムサムネイル - WhiteBrowser @WIKI - atwiki(アットウィキ) のサンプルバッチファイルを弄れば十分そう。
2番目に関しては、定番ツールの ffmpeg が、今は (準)公式なWindowsバイナリ も配布されていて、バイナリファイルを好きに置けばいいだけだから管理も楽。
自分の用途で扱う分にはサンプルバッチファイルで十分。
そんなわけで、ffmpeg を使うようにバッチファイルを書き換えてみた。
準備作業
- FFmpeg のオフィシャルサイトから、Windows用バイナリ(32bit/64bit)をダウンロードする。
(Windows10が、64bit なら64bitでよい。) - ダウンロードしたファイルを展開後、ffmpeg.exe と ffprobe.exe をWhiteBrowserのインストールフォルダ にコピーする。
(あるいは、配下に「bin」フォルダを作成し、そこにコピーする) - サムネイルを作りたい動画ファイルの拡張子 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.txtに temp.jpgがあるか?(ffmpeg.exeで抽出した画像ファイル)
ffprobe.csvの方は、動画情報を ffmgeg が取得できているかの判別。
timestamp.txtの方は、ffmpeg が動画ファイルの再生ができているかの判別。
ffprobe で情報を取れなければ、ffmpeg での処理は諦めて他の方法を考えましょう。
(2023/10/05 追記)
サムネイル画像が生成されない場合、コマンドプロンプトやWindowsTerminal上で ffprobe.exe を実行し出力内容を確認する。
もし、バッチファイル側が想定していない形式や異なる場所に width、height、duration に相当する情報があるならば、それらを取り出すようバッチファイルを書き直す。
一例として、mkv(Matroska Video File)の場合を記事末尾へ記載する。
サムネイル画像が作成されるが、破綻している場合(2023/10/05追記)
バッチファイルでサムネイル画像は生成されるが、ヘンテコな画像(全体が灰色で所々に輪郭線や赤緑青の点が混じる等)になる場合。
ffmpeg のWindows用バイナリに含まれる ffplay.exe で、その動画を再生してみる。
再生したとき、ヘンテコな映像にしかならないのなら、元の動画(の情報)が壊れている可能性が高い。
(あるいは、ffmpeg がその動画コーデックに対応していない可能性がある。)
もし、ffplay.exe の引数を弄って適切な映像が得られるなら、バッチファイル内の ffprobe.exe、 ffmpeg.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