2012年11月10日土曜日

ゆっくりMovieMaker3 開発日記 - 21 「DESの思わぬ落とし穴」

今日の作業内容
  • プレビュー処理の続き
  • プレビュー処理でぶち当たった問題点の解決策を探していた
プレビュー作業実装中、思わぬ壁にぶつかってしまいました。
今回はその検証記事です。
検証に使用する画像はこちら。ニコニコモンズからお借りしました。
デフォルメキャラを描いてみた(着色) / bob - ニコニコモンズ
http://commons.nicovideo.jp/material/nc943
症状の確認
500x500の正方形。これをDirectShowEditingServiceを使用し、等倍表示します。

ビデオサイズ:500x500に等倍表示した場合
これは問題ありません。
正常に表示されています。

ビデオサイズ:700x700に等倍表示した場合。
これも問題ありません。

ビデオサイズ:300x300に等倍表示した場合。
等倍表示なので、見切れてるのは正常な動作です。
ただし、今までの物と見比べて、明らかに異常な点があります。
そう。画質です。1番目・2番目と同じ画像を使用しているのにもかかわらず、画質が明らかに下がっています。
正常な物と比較すると、より以上がわかりやすいと思います。

ビデオサイズ:100x100に等倍表示した場合。
明らかに画質が劣化しています。
比較版はこちら。

なぜこのような現象が起こるのか
DirectShowEditingServiceで画像(動画)を読み込むと、最初から原寸大で表示されるわけでは無く、画面一杯に広がるようにロードされます。

これを、トランジションを用いて適切な大きさに変更するのですが、この変更作業をする際、トランジションはロード元の画像を参照するのでは無く、この横長に伸ばされた表示の方を参照しているようなのです。(これに気づくのに遅れ、かなり時間を浪費してしまいました・・・)
拡大した画像を元の大きさに戻すのならともかく、一度縮小して画質の落ちた画像を引き伸ばしているのですから、画質が落ちるのは当たり前です。



また、これは500x150のビデオに画像を表示した物ですが、横方向には正常に読み込まれているものの、縦方向が極端に圧縮された画像を引き伸ばしているので、横縞のような模様が付いてしまっています。

対処法
ではどうするのか。いくつか案を考えてみました。
1.諦める。
ユーザーに「動画サイズを上回る画像を表示すると画質が荒くなるんだけど?」なんて言われても「仕様です」と言い張る。
これが一番手っ取り早くて、中の人の労力的にもラクチンです。
ただまあ、これは出来ればやりたくない。

2.諦める。(2)
一つ目の方法と同じですが、「動画の出力機能」をバッサリとカットし、動画の出力は全部AviUtlにお任せ。
YMM側で画質が落ちても出力時には何ら問題はありませんよ!で通す。
これも出来ればやりたくない方法の一つ。

3.作業領域を多めに確保し、プレビュー・出力時にトリミングする。
動画を読み込んだ際、縮小した状態でロードしてしまうのが原因なのだから、最初から大きな画面を用意してやれば良い。という考え。
一度1000x1000や2000x2000等の大きな画面で編集をし、プレビュー時や動画出力時には適当なフィルタを通して適切な大きさにトリミングしてやるという方法。
メリットは、今までのDESの学習やプログラミングが無駄にならない・わりと楽(たぶん)な点。
デメリットは、依然作業領域として確保した画像より大きな物を読み込もうとすると画質が荒くなってしまうと言う点。
また、一度に大きな作業領域を確保すると、(どれくらいの影響があるかは分からないけど、)たぶん使用メモリ等負荷が大きくなる。

4.他の手段を使って動画のプレビューを実現させる。
DirectShowの他の機能(があれば利用する)や、DirectX、OpenGL、OpenCV等の他の手段を用いて(組み合わせて)プレビューを実現させる。
出来ればやりたくない。難易度が高いので極力避けたいです。

今後の方針
とりあえず、対処法の項目の3番、「作業領域を多めに確保し~~」でやってみようと思います。
動画を適切な大きさにトリミングするフィルタを使用するのですが、これがデフォルトでは用意されていないので、自力で作成するか、既存の(フリーの)フィルタを利用するしか無いのですが、方法などよく調べられてないので、少し気がかりではあります。
もし実現できそうに無い場合は別の方法に切り替える(or諦める)として、しばらくはこの方針で。
なにか良い案があれば、教えて頂ければ有り難いです。


以下、詳細な作業内容

今日の作業内容(完了)
今日の作業内容(途中)
以前の作業内容(完了)
動画
  • ズーム→完了
  • 表示位置→完了
  • カット→完了
  • 透明度
  • 倍速
画像
  • ズーム
  • 表示位置
  • カット→完了
  • 透明度
  • png読み込み
字幕
  • 表示位置→完了 
  • カット→完了
  • 縦書き
音楽
  • カット→完了
  • 倍速
  • 音量
ゆっくりボイス
  • カット→完了
  • 音量
  • 字幕
  • 追加アイテム
  • ゆっくりボイス読み込み
キャラ素材
  • カット
  • キャラ素材読み込み

その他
  • クロップフィルタの自作or既存フィルタを使用する処理

0 件のコメント:

コメントを投稿