2008年8月2日土曜日

Gyao 動画を携帯で見る(3)

==================================
前回までのあらすじ
・携帯動画変換君+avisynth+Automate UnDRM で .asf を .mp4 に変換できた
・SoftBank 810P は動画の指定時間へのジャンプがないので,早送りで進めるのは時間がかかる
・Yamb で分割→失敗 (途中で再生が終わる)
・MP4Box でチャプターを打つ→810P はチャプターを認識せず
・_| ̄|○←いまここ
==================================

 と言うわけで,最終手段である,ffmpeg の範囲指定エンコーディングで細切れエンコーディングを行う,というバッチファイルを作った.ffmpeg のオプションで -ss <開始時間> -t <エンコード時間> と言うのがあるのでこれを試してみたら,開始時間までのシーク? にえらい時間がかかる.この分割エンコードでは何度も ffmpeg を起動するわけだから,このシーク時間は無視できない.

 なので,avisynth の方でやってみた.携帯動画変換君付属の ffmpeg は,avisynth 経由で動画をオープン (入力動画ファイル指定に .avs を指定する) することができるので,avisynth の Trim( <開始>, <終了> ) で範囲指定できる.具体的には,バッチファイルで「Trim() の数値を順に増やしながら .avs ファイルを作成し,それを ffmpeg に読み込ませる」を何度か繰り返せば,分割エンコーディングが実現できる.

 次の問題は,動画の総フレーム数をバッチファイルは知らないので,いつ分割作業をやめればいいのか,の判断がバッチファイルには分からない.一方,avisynth は動画の総フレーム数を知ることができるので,「エンコード開始フレーム位置が総フレーム数を超えていたら,わざとエラーを起こしてエンコードを失敗させる」ことにした.こうすれば,バッチファイルは,ffmpeg を起動したのに .mp4 が作成されていないので,分割処理終了を判断することができる.

このときの .avs はこんなかんじ

DirectShowSource("video.avi")
( FrameCount() > 開始フレーム ) ? Trim( 開始フレーム, 終了フレーム ) : 0/0

開始フレーム・終了フレームは,バッチファイルで値を変えながら何度か ffmpeg が実行される.で,キモは 2行目の 0/0 で,開始フレームが総フレームを上回ったら,division by 0 を発生させて ffmpeg を終了させることで,.mp4 は作成されない.

-----
追記:
810P の連続再生はファイル名の逆順で再生,と思ってたら,違ってたみたい.どうやらファイル作成日時 (またはファイル更新日時) の逆順みたいだ.

0 件のコメント:

コメントを投稿