2011年8月8日月曜日

MediaPlayerClassic + AviSynth で 1.5 倍再生

PS3 には 1.5倍再生機能があって便利なので,PC でもやってみた.

でも x倍再生機能がある動画プレイヤーは他の機能がしょぼかったりしたので,普段使っている MediaPlayerClassic (MPC) + AviSynth でやってみた.MPC には最初から avs スクリプト再生機能があるので,1.5倍再生スクリプトを書いて MPC に読ませるだけで ok.スクリプトはこんな感じ.
Scale1 = 3
Scale2 = 2
DirectShowSource( "hoge.ts", pixel_type="YUY2", convertfps=true )
AssumeScaledFPS( Scale1, Scale2 )
TimeStretch( tempo = Scale1 * 100.0 / Scale2 )
convertfps=true は VFR を CFR に変換するために必須.
AssumeScaledFPS で映像の再生速度を 1.5倍にして,TimeStretch で (音程は変えずに) 音声の再生速度を変える.

これで完璧ヘ(^∇^ヘ)ヘ(^∇^ヘ) ウヒョヒョ と思っていたら,なんか映像と音声がずれる.どうも convertfps=true をつけると映像の冒頭がなぜか切り捨てられることがあって,その分の音声がずれるらしい.DirectShowSource はいろんなフォーマットの動画が読み込めて便利なんだけど,ちょっと変わったことをしようとするととたんに音声がずれて使い勝手が悪い.

というわけで他の方法を模索.FFmpegSource というプラグインがあったので,それを使ってみた.
Scale1 = 3
Scale2 = 2
FFmpegSource2( "hoge.ts", atrack=-1, cachefile="hoge.ts.ffindex", fpsnum=30000, fpsden=1001 ).ConvertToYUY2
AssumeScaledFPS( Scale1, Scale2 )
TimeStretch( tempo = Scale1 * 100.0 / Scale2 )
FFmpegSource は ffmpeg という知ってる人は知ってる有名な動画エンコーダの動画リード部分を流用しているだけあって,安定性は抜群.これで音ズレなくまともに 1.5倍再生ができるようになった.
ただし問題がひとつあって,FFmpegSource は動画ファイル毎にインデックスファイルを作成してからでないと再生が始まらない.1時間の番組で 30秒ほどかかることもあるので,この間待ちぼうけを食らうのも辛い.

なので,まず通常速度で再生する MPC を起動しつつ裏でインデックスを作成して,作成が終わったら改めて 1.5倍再生する MPC を起動するバッチファイルを組んだ.FFmpegSource のパッケージにインデックスを作成するコマンドラインプログラムが付属しているので,それを使う.
バッチファイル (正確には WinBatchEh のスクリプトだけど) はこんな感じ.
: 変数セット
set TmpDir=%temp%\mpc_playlist
set Player="C:\Program Files\MediaPlayerClassic\mplayerc.exe" /fixedsize 860,550
set FileName=%1

: tmp ファイルフォルダ作成
if Exist %TmpDir%\ del /y %TmpDir%\*
mkdir %TmpDir%

: .avs 作成
set FileNameOrg=%FileName%
StrTokFile=STF_NAME FileName "%FileName%"
set FileName=%TmpDir%\%FileName%.avs

echo Scale1 = 3> "%FileName%"
echo Scale2 = 2>> "%FileName%"
echo FFmpegSource2( "%FileNameOrg%", atrack=-1, cachefile="%FileName%.ffindex", fpsnum=30000, fpsden=1001 ).ConvertToYUY2>> "%FileName%"
echo AssumeScaledFPS( Scale1, Scale2 )>> "%FileName%"
echo TimeStretch( tempo = Scale1 * 100.0 / Scale2 )>> "%FileName%"

: とりあえず普通再生の画面を起動
start %Player% "%FileNameOrg%"

: index を作成,1個出来たら mpc 起動
exec=SW_HIDE "C:\Program Files\AviSynth 2.5\plugins\ffmsindex.exe" -p "%%a" "%FileName%.ffindex"
start %Player% "%FileName%"
途中まで再生された後,また MPC が立ち上がって最初から再生されちゃうけど,まぁ手でシークすればいいし許容範囲内かな.
-----
WSH の javascript で書いたものを置いときます
SFC mini も入れといてください.

0 件のコメント:

コメントを投稿