
preAudio,preVideoVolMaxのうち、もっとも注力したのは、preAudio,preVideoです。DirectShowをC#のプログラムで使用して、それぞれ音声、映像をデコードします。C++でファイル出力用フィルタを作って、インストールするのが普通の方法のようですが、「C#」と「フィルタをインストールしない」ことを目標にしました。 ■なぜDirectShowでデコードするのか私も最初は以下のように考えて、NSVSplitなどを作りました。 しかし、音がズレたり、プツプツするのに、「汎用的な解決方法がないこと」が分かってきました。たとえば、固定フレームレートの動画ファイルの場合、音声データを集めると、映像の再生時間より短いことがあります。コンテナが映像と音声のペアを管理できる場合には、「データがないことが無音を表現している」ことによるのだと思います。MP3の音声の場合、1フレームが26ms固定のものが使われています。映像が29.97fpsなどで固定なら、無音の時間は、音声の単位である26ms未満になりえるので、もともと表現することができません。 どんな動画ファイルも、ベストで再生できるように考えられていることは確かだと思います。再生困難で、見苦しいものをわざわざ作る理由はありません。もっとも普及しているDirectShowの再生環境への対応も必ずあるはずだと思い至りました。 音声を「ファイルから抽出してPCM化」したものと、「DirectShowでPCM化」したものは、時間的に同じでない。と言う理解に基づいています。 ■なぜ音声をPCMファイルにしたか
■なぜ映像をYUY2にしたか YUY2も圧縮のうちかもしれないが、そのままレンダラーに入力できるので、ここでは生データと考える。DirectShowとffmpegの両方にあるものが候補。 ■preAudioのコマンドラインオプションpreAudio in_file [-o out_file] [-at n] [-m media_info_file] [-log log_file] n_file :入力となる動画ファイル ※1 数字の場合トラックの番号(ゼロから)。文字の場合、指定文字列が含まれるトラック。(大文字小文字区別しない)。 ■preVideoのコマドラインオプションpreVideo media_info_file [-log log_file] media_info_file :出力するメディア情報ファイル ■注意1.DOS窓で使用していて、スクロールバーを左ボタンで掴んだままにするとアボートする。デコード結果のフレームを受信する箇所の時間監視でエラーを検出する。この時間監視の要否は良く分からないが、当面このままにする。
|

