index生成機能により再読込時の高速化、マルチストリームのデコードにも対応
MPEG-2 VIDEO VFAPI Plug-Inのglファイルやffmpegsourceのインデックスファイル的なストリーム情報を拡張子 index ファイルとして生成する機能が L-SMASH Worksに追加されました。これにより、一度読み込んだストリームはindexファイルに保存され、2度目以降の読み込みは解析待ち時間が発生せず高速にアクセスできます。

index の使い方
↑なお index値を -1 にしてチェックすると、そのストリームの読み込みを無効化できる
Libav-SMASH File Reader setting に「Libav video index」と「Libav audio index」の項目が追加され、チェックを入れたindex値に対応するストリームを読み込むのが基本動作ですが、最初は両方ともチェックを入れずファイルを読み込み、indexファイルを生成しましょう。なぜなら、indexファイルが生成される前にビデオ/オーディオストリームのindex値はわからないためです(index値はTSでいうPIDとは別ものです)。

解析が終わると、読み込んだファイルと同じフォルダに「読み込んだファイル名.index」というindexファイルが生成され、2度目以降の読み込みはindexファイルの解析済み情報をリードして高速なアクセスを実現します。また、indexファイルから対象動画ファイルの読み込みにも対応しているため、AviUtlのウインドウにindexファイルをドラッグ&ドロップすることもできます。

indexファイルから目的ストリームのindex値を見る
例えばTSファイルを読み込むと、デフォルトではHD映像をアクティブストリームとして展開するため、HD映像のみで良いケースにおいては特に何の設定変更もなく使えます。しかし、わかさトラップ(*1)のようにHD・SDストリームが混在していたり、マルチチャネル放送のようにSD1・SD2といった同時間軸で複数番組が入っているマルチストリームについては、Libav-SMASH File Reader settingで対象ストリームのindex値を指定するか、indexファイルを直接書き換えて読み込むことが可能となりました。

(*1)わかさトラップ:マルチチャネル放送をしている局で、SDマルチ送信からHD送信(またはその逆)への切り替え意味し、切り替わる直前のSD映像が「わかさ生活のCM」であることが多かったTOKYO MXさんの放送から由来している。のりしろ録画した際、頭のSD映像のPIDを取得するとHDに切り替わったところで映像がデコードできなくなる(わかさ生活のCMで止まるため、罠→トラップ)など、ストリーム切り換えに対応していない大半のプレイヤ(Splitter)やツールで、わかさトラップのありがたい恩恵(罠)を受けられる(TVTestといった対応アプリでは問題ない)。回避するには、HD映像とSD映像の各ストリームを分離するか、DGIndexでPIDを指定して対象ストリームのみをデコードさせるといった工夫が求められた。

では、ストリームのindex値を知るため、indexファイルを開いてみましょう。indexファイルはテキスト形式であるため、普通のテキストエディタで読み込めます。

5行目まではファイルパスや読み込むストリームindex値(デフォルトでHD映像とその音声ストリーム値)、6行目以降は解析されたストリーム情報が記録されており、Index から始まる2ラインが解析単位となっています。

  • 映像ストリーム情報のフォーマット(ver.3)
  • Index,Type,Codec,TimeBase,POS,PTS,DTS
    Key,Width,Height,PixelFormat

  • 音声ストリーム情報のフォーマット(ver.3)
  • Index,Type,Codec,TimeBase,POS,PTS,DTS
    Channels,SampleRate,BitsPerSample,Length

    映像は、Width(映像の横解像度)もしくはHeight(映像の縦解像度)をピクセル値で検索するのが確実で、HD映像は縦1080ピクセル(デコード後のスライスされた値)ですから、Height=1080で検索すると……


    このように、HD映像はindex値26であることが判ります

    # HD映像はデフォルトで適用されるため基本的に調べる必要はありませんが、手順と実証のため書いてあります

     

    次にSD映像ですが、縦480ピクセルですのでHeight=480で検索すると……

    index値が0と12の二つ存在しますね。これは、例として解析したストリームにSDマルチ放送として2つのSD番組が混在しているためで、index値0 がSD1、index値12がSD2となっています(SD1とSD2の確認は、それぞれ読み込んで見るしかない)。

    音声ですが、わかさトラップの場合、HD映像とSD1の音声ストリームは同じであるため、SD1音声はデフォルトで検出されるindex値(このケースではindex値1)を流用してかまいませんが、SD2側の音声は要検索となります。SampleRate=48000で検索すると、このように複数引っかかるため判断は難しいのですが、Length=0以外(この例では1024)である可能性が非常に高いため、index値1がHD及びSD1音声ストリーム、index値11がSD2音声ストリームとなります。これも実際に指定して音を聴いて判断しますが、BitsPerSampleやChannelsも同様の値である事が多く、Length値で判断するのが無難ですがこれも過信はできません。

    同じ要領で、ワンセグを展開したい場合は Width=320 等で検索すればビデオストリームのindex値が判明するので、用途に合わせてindex値を検索してください。

    これらの検索結果から、サンプルとして使用したファイルの各ストリームおよびindex値は以下のようになることがわかります(ただし、値は放送内容によって異なる)。

    ↑indexファイルを直接書き換えてSD2映像・音声(video index : 12、audio index : 11)を読み込んだ例
    判明したindex値は、Libav-SMASH File Reader settingでそれぞれ指定して読み込むか、indexファイルの<ActiveVideoStreamIndex>で読み込みたいビデオストリームのindex値、<ActiveAudioStreamIndex>で読み込みたいオーディオストリームのindex値に書き換えてから、そのまま読み込ませてもかまいません(indexファイルを書き換えた場合はLibav-SMASH File Reader settingでindex値を指定する必要はありませんが、index生成が完璧でなく正常に読み込めないケースもある)。

    また、対象ファイルを他のフォルダへ移動させた場合は、indexファイルの2行目<InputFilePath>でフルパスのファイル名を指定し直せば、indexファイルの再生成を省くことが可能です。なお、indexファイルの1行目<LibavReaderIndexFile=n>はindexファイルのVersionを示しています(r225ではver.3)。

     

    まとめ

  • 最初にindexファイルを生成するときはLibav-SMASH File Reader settingの「Libav video index」と「Libav audio index」のチェックを外しておく

  • 生成されたindexファイルを直接書き換えて読み込ませることも可能

  • 解像度やサンプリングレートなど映像・音声の要素からindexファイルを検索して、ストリームのindex値を調べる

  • ただし、HD映像の場合は検索不要(音声がマルチチャネルの場合は音声のindex値を要検索)

  • マルチチャネルSD映像・音声のindex値がわかったら、Libav-SMASH File Reader settingの「Libav video index」と「Libav audio index」で指定して読み込むか、indexファイルの<ActiveVideoStreamIndex>や<ActiveAudioStreamIndex>をindex値で書き換える

  • 選択したストリームが正常にデコードできない場合(とくに音声)は、一度indexファイルを削除してからLibav-SMASH File Reader settingの「Libav video index」と「Libav audio index」で対象値を指定してindexファイルを再生成してみる

  • 稀にフレームレートを正常に取得できないケースがあり、その場合はAviUtlの「編集」→「再生速度の情報を変更」で本来のフレームレートを指定する(システム設定の29.97fps自動補正は、意図して29.97fpsから微妙にずれている正しいフレームレートを修正してしまう可能性があるため推奨はしません)。

  • ダウンロード
  • 以下のバイナリはかなり古いため使用を推奨しません。
    L-SMASH Works r225 プラグインセット
    L-SMASH Works r225 ソースコード

  • リンク
  • AviUtlのお部屋
    VFR-maniac/L-SMASH-Works
    l-smash - A simple tool for mp4. - Google Project Hosting
    Get ffmpeg(L-SMASH Worksの推奨ライブラリは Libav)

    1件のコメント

    1. > takeさん

      お久しぶりです。
      具体例を書かずお手数をかけてしまい恐縮です。

      再格納についてですが、(2)までの手順に間違いはなく、(3)以降について書きたいと思います。

      timelineeditor は **_track1.h264 といったrawストリームファイルを受けられないため、 muxer でmp4コンテナに格納してから timelineeditor でタイムコードを適用する流れとなります。

      例:
       3) muxer -i **_track1.h264 -o **_track1.mp4
       4) timelineeditor –timecode **.tmc **_track1.mp4 **_track1_vfr.mp4

      こうすることで L-SMASH で再格納された **_track1_vfr.mp4 が出来上がるという流れになりますのでお試しいただけますでしょうか。

      不明な点がありましたら遠慮せずお尋ねください。

      POP
    2. おぉ~~!! 出来ました!!

      教えて頂いた通りmuxerで.mp4に格納する手順を追加することで無事に成功しました。
      timelineeditorへの記述は奇跡的にも正しかったようです(笑)

      何度も検証・回答などして頂き本当にありがとうございました。

      take
    3. はじめまして。
      配布して頂いたプラグイン、大変有り難く使わせて頂いております。
      なるべく自分で解決するようにはしているのですが、どうしても上手く行かないことがありまして…

      ①なぜか複数音声のMKVが読めない(画面が緑に)、indexが作成されない。

      問題の動画ファイルは

      video:
      AVC High 10@L5.0
      Ref 5 フレーム
      1920×1080
      CFR,23.976

      audio1:FLAC
      audio2:AC-3

      現在、MKVExtractで分離して対応しています。
      同じ設定で音声がマルチ出ないものは正常です。

      ②FPSが変わるものに於いてTimecodeが作れない。
       再エンコするときにどうしても上手くいきません…

      どうか解決策をお願いします

      tk925
    4. 追記

      VFR,CFRでも関係なくTimecodeの生成がされません…

      「Faild to get track_ID」と表示されます。

      tk925
    5. stream_indexの指定をffprobeで取得したidの指定をすると、以前は読み込めたのが、何故か最近
      LWlibavVideosource:failed to get the video track.と言われるようになりました
      -1指定でも同じで何か変わった等あるでしょうか?

      駄目な男

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    9 + 1 =

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください