無劣化分割結合の制限
AmuseGraphicsの動画編集ユーティリティでは無劣化でのAVIファイル切り出しと結合が行なえるのだが、単純な切り出しや単純な結合は問題ないものの、切り出したデータを結合すると音声と画像がズレる場合がある。原因はハッキリとしているので少し制限事項を設ける。
« 2010年1月 | トップページ | 2010年3月 »
AmuseGraphicsの動画編集ユーティリティでは無劣化でのAVIファイル切り出しと結合が行なえるのだが、単純な切り出しや単純な結合は問題ないものの、切り出したデータを結合すると音声と画像がズレる場合がある。原因はハッキリとしているので少し制限事項を設ける。
AmuseGraphicsの動画編集ユーティリティは機能的にはデスクトップレコーダーとの連携機能を除いて実装できているのだが、使い勝手がイマイチだったので、表示系を少し改善した。Direct3Dによる表示を導入し、そのためもあって、表示領域は別ウインドウにした。
昨日書いた問題は、DirectShowの問題ではなく、作者のコードに問題があった。なので修正したのたが、読み込み側と書き込み側で独立したグラフを動作させ、それぞれに音声と画像があるため、合計4つのバッファをロックさせないようにしなければならず、結構大変だった。
編集ユーティリティには色々なルーチンをバラック的に組み入れていたため、現在はコードを整理しているのだが、今日、エンコード用のルーチンを書き直していたら、上手く動かなくなった。原因はまだ不明だが、DirectShowとマルチスレッドとの関係のような気がしている。
作成中の編集ユーティリティで実際にデスクトップレコーダーで取り込んだ動画から領域を指定して切り出してみたのだが、500MB程度のモーションJPEG動画から少しだけ切り取るのに10秒程度、ほぼ全て切り取るのに3分程度かかった。なので、少し高速化した。
開発中の編集ユーティリティの再生ルーチンはDirectShowベースのため、動画ばかりではなく、静止画や音声ファイルも扱える。静止画についてはAmuseGraphics本体があるので対象外としたのだが、音声ファイルについては再生できるようにしておいた。
編集ユーティリティの使い込みをしたりしていたところ、音声と画像が少しずれたり、シーク後に音声が乱れることがあった。どちらも音声のバッファリングに関する問題だったのだが、微修正しておいた。DirectShowからの音声入力は定期的に来る訳では無いようだ。
編集ユーティリティはデスクトップレコーダーとの連携機能を除いてほぼ完成したので、今週はデスクトップレコーダーとの連携機能を入れることになるのだが、それ以外にも色々と変更しなければならない点がある。
今日は特に書くべきことが無い。なので、例によって、時事ネタにすることにした。マイクロソフトが鳴り物入りで「Windows Phone 7」の概要を発表したのだが、特長を見ていると、iPhoneとそっくりだ。発売は年末らしいので、出荷される頃には忘れ去られていることだろう。
今日は編集ユーティリティの見た目を修正していた。元々作っていたビットマップは機能確認用に適当に作ったので、リリース版用に作り直していたのだが、直ぐに終わるかと思っていたら、結局、これしか出来なかった。まあ、動画関連ツールなので、見た目も重要だ。
今日は作成中の編集ユーティリティにプレイリスト機能を追加した。複数の動画ファイルを連結したい場合には、プレイリストにファイルを追加して行き、最後に切り出す範囲を指定して出力させることになる。同一形式のファイルばかりなら、エンコード無しで出力できる。
昨日の時点で、大体、内部構造については目処がついたため、今日はユーザーインタフェースを作成していた。標準部品を使えば数分でコーディングできる程度のものなのだが、自前でグラフィカルなインタフェースを作るとなると、一日あってもまだ足りない。
予告した通り、今日はVCMコーデックの設定をDirectShowのインタフェース経由で行なってみたのだが、普通に行なえてしまった。一年程前にやった時には出来なかった筈なのだが、当時はあまり理解出来ていなかったので馬鹿なことをやっていたのかもしれない。
DirectShowベースのDivxデコーダーとSampleGrabberが接続出来なかったのは、SampleGrabberの制限事項のようだ。ISampleGrabberのSetMediaTypeメソッドにある説明に「FORMAT_VideoInfo2 のフォーマット タイプのビデオ タイプはすべて拒否する」とあった。
作成中の編集ユーティリティでDivX動画の再生が行えない本質的な理由はサンプルグラバーが接続できていないことだと判ったのだが、それ以前にグラフ作成時に「divxsmは動作を停止しました」というダイアログが表示される。こちらの方が本質的では無い分、迷惑だ。
今日はネットを検索したりしながら動画関連の常識を仕入れていたのだが、色んな意味でため息が出た。昔は動画と言えばMPEG1と2で統一されていたものだが、今は色々な形式が氾濫している。で、エンコードにはグレーなプログラムが使用され、再生の互換性は低い。
今日は編集ユーティリティにエンコード機能を追加した。指定領域をフレームレートと画像サイズを変更しつつ、DiectShow対応コーデックを使ってエンコード出力できる。で、時間が押しているので、別途用意する予定だったエンコードユーティリティは無しにすることにした。
AVI編集ユーティリティの再生方式はDirectShowベースに変更したのだが、データはSampleGrabberで採取して自前で再生する方式にしたのでレンダラーは不要になった。なので、NULLレンダラーに代えてみたのだが、画像と音声にズレが出たので元に戻した。
今日はAVI編集ユーティリティの再生をDirectShowベースに変更した。これで、デスクトップレコーダーで録画していたMJPG動画も見れるようになった。DirectShowのビデオレンダラーは画質が汚かったので、SampleGrabberで取り込んだ画像を自前で表示している。
SampleGrabber用のコールバック関数を実装し、取りこぼしなくデコードデータが採取できることを確認できた。これでDirectShowのデコード機能を応用できる。DirectShowへの画像/音声入力用フィルターも作成済みなので、色々とやれそうなのだが、やると疲れそうだ。
編集ユーティリティでの表示/エンコード方式としてDirectShowを何処まで使うかはまだ決定していないのだが、とりあえず今日は、最低限必要な、WMVやMPG等、DirectShowでは再生が可能な非AVI形式ファイルをAVIファイルに変換するルーチンを実装した。
AVI編集ユーティリティにはまだDirectShow対応を行なっていないのだが、現状でもVCM対応の動画は再生できる。なので、手持ち動画を見たりしているのだが、やはり、標準ダイアログ部品で操作すると興ざめだ。なので、操作部品については自前で作成することにした。
AVI編集ユーティリティにはDirectShowを導入して表示やデコードを行なわせることにしたのだが、そうすると作成中のAVI用C++クラスをあまり使用しないことになるため、今日は引き続きC++クラスを使い込んでみた。AVIヘッダを弄ってみると色々な現象が発生した。
AVI編集ユーティリティについては、作業が進み、再生、切り出し、結合、エンコードは可能になった。つまり、予定していた最低限の機能は実装できたのだが、それだけでは問題があることが判った。なので、AmuseGraphicsのプロモーション作業は少し延期する。
今日は例によって書くべきことが無いので、「PC Watch」で見つけた珍しい記事に関連した話題を書いてみる。見つけた記事は、続「PilePaperFile」 ~「欲しい」が止まず年間50本のソフトを開発 というものなのだが、普通の記事とは赴きが異なる。
作成中のAVI編集ユーティリティでは、まだ、編集はできない。しかし、普通に音声付動画を再生できるようにはなったので、手持ちのAVIファイルを色々と試してみたのだが、正しく再生できないファイルも幾つか見つかった。メディアプレイヤーでは正しく再生されるのだが。
AVI編集ユーティリティを開発中だが、目だった進捗は無い。まあ、画像と音声を再生できるようにはなったのだが、基本的には既存ルーチンの組み合わせで出来る筈のことだったので、作者的には大したことではない。しかし、プログラムはジワジワと形を成しつつはある。
AVIファイル編集ユーティリティを作成中だが、まずは再生処理を実装した。既にAVIファイルから画像と音声を切り出すルーチンは作成済みだったため、他プログラムから画像/音声処理関数を流用して無圧縮動画の再生は容易に行なえたが、圧縮動画の再生にはひとひねり必要だ。