スポンサーリンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 地道な改良も | トップページ | コード整理は必要だが »

エンコード時は連続出力化

今は、AmuseGraphics Ver1.4.1の開発フェーズで、macOS版AGMPlayerに続き、macOS版AG-ムービーカッターの変更作業中なのだが、トランジション効果を適用すると、効果の最初と最後で音声が不連続になる場合があるので、エンコード時は特別な処理をする事にした。

既に書いてきた様に、AG-ムービーカッターの内部処理では、基本的には、合成用の動画とベースになる動画は別物扱いしていて、ベースになる動画は、常に1つしか存在しない作りになっている。

なので、二つのベース動画を合成しなければならないトランジション効果を実現するにあたっては、二つの動画を入力として合成動画を出力とする仮想的な動画タイプを追加し、トランジション効果期間では、この仮想的な動画タイプの動画をベース動画として扱う格好にした。

その結果として、AG-ムービーカッター的には、アーキテクチャレベルの変更なく、トランジション効果を実現できたのだが、これも既に書いてきた様に、この様な形態にすると、通常の動画とトランジション効果で使用する動画で、シークタイムの連続性が保てなくなる場合もある。

なので、映像に関しては、30FPSの1,2フレームが削られたりしても、普通は違和感は感じない筈なのだが、音声については、AG-ムービーカッターでは、約0.1秒を1フレームとして扱っているので、このフレームが欠損したり重複したりすると、違和感もある訳だ。

で、AGM形式動画については、かなり正確なシーク動作が可能になっていて、シーク後、前述の1フレームについても、その中の有効データと無効データを把握して、有効データのみ利用する事も出来る様になっている。

しかし、一般の動画形式については、そこまで正確なシークが行えるモノの方が少ない筈で、macOSで利用しているAV Foundationはまだ良い方かもしれないのだが、Windows環境のDirectShowなんかでは、結構、シーク時のタイミングにラグが出たりもするかもしれない。

と、いう事で、シーク動作によって、通常動画領域とトランジション領域を繋ぐ格好にすると、特に、音声出力に不連続感が出てしまう場合があるので、エンコード時には、トランジション効果が挿入されている場合にも、使用する動画ファイルの出力はシーク動作させる事なく、連続して使用する格好に変更する事にした。

具体的には、トランジション効果の映像と音声を出力する仮想ファイルは、現時点では、トランジション効果の開始タイミングで、利用する2つの動画ファイルをオーブンし、トランジション効果に利用するタイミングにシークさせた後、再生動作を開始しているのだが、スタートタイミングでは、それまで再生していた動画の再生環境を引き継ぎ、そのまま、再生結果を得る様にし、終了タイミング後の動画再生については、前述の仮想ファイル内で使用していた動画ファイルの再生環境を引き継いで再生が継続される格好に変更する。

上記の様にすれば、トランジション効果の開始/終了タイミングでシーク動作は入らなくなるので、出力データの不連続生を無くせる訳だ。

もっとも、書くと単純なのだが、実際の所としては、上記の様な対応は、データのバッファリング辺りを含めて、結構、色々な処理を変更しないと実現できないので、対応するのはエンコード出力時のみにする予定だ。

つまり、再生時には、トランジション効果の最初と最後で、不連続な映像/音声が出力される格好になる場合もあるのだが、実際の所、AG-ムービーカッターの再生というのは、動画編集時の確認用なので、何も、再生品質に拘る必要もない筈だ。

と、いうか、AG-ムービーカッターでの再生時には、領域の切り替えタイミングで、一瞬、映像や音声が不連続になるというのは、そのタイミングが判りやすくなるメリットすらあるかもしれないので、変更はエンコード時に限る事にする訳だ。

ちなみに、変更はまだ行なっていないので、あまりにも変更が大変、という事になったら、変更の取りやめもあるかもしれないのだが、前述の様に、理屈の上では単純なので、普通に鑑みれば、実現できない筈はない。

しかし、実現できない筈はない、という話をするのであれば、AG-ムービーカッターのアーキテクチャを変更してしまって、使用する動画は全てオープンしておき、再生/エンコードタイミングで、使用する動画を判定し、それらを合成した映像/音声を出力する様に変更する事も、実現できない話でもない訳だ。

実際の所、最も簡単な動画編集の方法としては、ファイルの読み込み時に、全ての動画フレームと音声のデコード結果をメモリに蓄えておき、再生/エンコード時には、それらを使用して出力映像/音声を合成する方法だ。

何故なら、そういう格好にしておけば、使用する動画ファイルの形式を意識する必要はなくなるので、再生/エンコードルーチンを単純化できるからだ。

しかしまあ、そんな事をすると、実際に使用したい期間が10秒程度でも、その10秒を包含している動画ファイルが数時間あれば、最低でも数十GB程度のメモリは必要になる筈だし、全ての領域をデコードする必要がない筈であるにも関わらず、動画ファイルの読み込み時には、全領域のデコードが必要になるので、数分程度は待たされるケースも出てくる筈だ。

と、いう事で、まあ、上記の様な事をやっている動画編集ソフトも、巷にはあるかもしれないのだが、作者的には、AG-ムービーカッターを、そんな、メモリを食う重い編集ソフトにはしたくないので、チマチマとした実装も必要になってくる訳だ。

« 地道な改良も | トップページ | コード整理は必要だが »

2019年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google