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. いつも大変ありがたく使わせて頂いております。
      r306を使用しての不具合と思われる現象をを一応報告致します。

      WMVファイルの音声が16bitのファイルは問題ないのですが、
      24bitのファイルは音声が割れてしまいます。

      それと以前のバージョンr226では正常に開けるのですが、
      r306では以下の様なエラーで開けないmp4ファイルがあります。

      アドレス”0x660cb7cb”で例外”0xc00000fd”が発生しました

      発生モジュール : lsmashinput.aui
      オフセットアドレス : 0x0050b7cb
      備考 : INPUT_PLUGIN_TABLE::func_open() [Libav-SMASH File Reader]

      以下がその開けないファイルの情報です。

      全般
      フォーマット : MPEG-4
      プロファイル : Base Media
      コーデック ID : isom
      サイズ : 1.03 GiB
      ながさ : 1時 59分
      OBR モード : CBR モード
      オーバルビットレート : 1 230 Kbps
      エンコード日 : UTC 2012-07-05 00:37:57
      タグ付け日 : UTC 2012-07-05 00:37:57

      ビデオ
      ID : 1
      フォーマット : AVC
      フォーマット/情報 : Advanced Video Codec
      プロファイル : High@L3.0
      CABAC : いいえ
      RefFrames : 1 フレーム
      Format_Settings_GOP : M=1, N=33
      コーデック ID : avc1
      コーデック ID/情報 : Advanced Video Coding
      ながさ : 1時 59分
      Source_Duration/String : 1時 59分
      ビットレートモード : CBR モード
      ビットレート : 1 045 Kbps
      ノミナル : 1 100 Kbps
      幅 : 720 ピクセル
      高さ : 396 ピクセル
      解像度 : 16:9
      モード : CFR モード
      フレームレート : 29.970 fps
      標準 : NTSC
      ColorSpace : YUV
      ChromaSubsampling : 4:2:0
      BitDepth/String : 8 ビット
      スキャンの種類 : プログレシッブ(PPF)
      ビット/(ピクセル*フレーム) : 0.122
      ストリームサイズ : 894 MiB (85%)
      Source_StreamSize/String : 941 MiB (89%)
      言語 : 英語
      エンコード日 : UTC 2012-07-05 00:37:57
      タグ付け日 : UTC 2012-07-05 00:37:57
      mdhd_Duration : 7165937
      colour_primaries : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M
      transfer_characteristics : BT.601-6 525, BT.601-6 625, BT.1358 525, BT.1358 625, BT.1700 NTSC, SMPTE 170M
      matrix_coefficients : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M

      オーディオ
      ID : 2
      フォーマット : AAC
      フォーマット/情報 : Advanced Audio Codec
      プロファイル : LC
      コーデック ID : 40
      ながさ : 1時 59分
      ビットレートモード : CBR モード
      ビットレート : 127 Kbps
      チャンネル : 2 チャンネル
      チャンネルの位置 : Front: L R
      サンプルレート : 48.0 KHz
      ストリームサイズ : 109 MiB (10%)
      言語 : 英語
      エンコード日 : UTC 2012-07-05 00:37:57
      タグ付け日 : UTC 2012-07-05 00:37:57
      mdhd_Duration : 7192033

      azazel
    2. > azazelさん

      まず24bitなWindows Media Audioですが、チェック用に当方で拵えて読み込んでみたところ、確かに音割れしますね。じつは、同じような症状は Real Audioでも発生するのですが……。

      ffmpegやlibav(avconv)でデコードしてPCMで出力してみると正常な音声になるため、L-SMASH Worksの実装かparser等の問題という可能性もありますが、muken氏のTwitterアカウントに音割れを報告すると良いかもしれません。
      http://twitter.com/MP4_maniac

      #追記
      muken氏に当方から報告しておきました

      次に、開くとエラーが出るmp4コンテナファイルですが、ストリームの情報だけですと原因が掴めないため、該当ファイルをどこかにアップロードしてサンプルとして提出していただけると助かります(短いストリームでかまいません)。当方での確認やmuken氏へ報告するにせよ、該当サンプルがないと原因の特定や対処が難しくなるためです。

      POP
    3. 30秒以上の動画を読み込むとエラーメッセージの後に画面が緑になります
      どうすればいいですか?
      後High@5.1 mkv を読み込むことはできますか?
      スペック
      Windows7 Home Premium
      64bit
      8GB

      niwakarabu
    4. > niwakarabuさん

      30秒以上の動画の詳細がわからないと何ともお答えしようも無いのですが、詳細がわからないようでしたら該当映像を何処かのアップローダーにpassword付きでアップし、サンプルとしてご提供いただけますでしょうか。

      次に、High@5.1 mkv ですが、H.264のHigh@5.1 映像ストリームをmkvコンテナに格納した動画という意味でしたら読み込み可能です。

      POP
    5. 30秒じゃなくて30分でした・・・

      アドレス”0x660cb7cb”で例外”0xc00000fd”が発生しました

      こんなメッセージが出てしまいます・・・

      25分の動画は読み込むことはできました。

      niwakarabu
    6. > niwakarabuさん

      できれば以下の情報が知りたいので、分かる範囲でお知らせいただけますでしょうか。

       ・動画と音声のコーデック
       ・解像度
       ・コンテナ
       ・ファイルサイズ
       ・PC環境(OSなど)
       ・作成時に使用したツールすべて

      よろしくお願いします。

      POP
    7. 映像
      10bit AVC/H264 High 10@5.1

      音声
      AAC 48.00KHz 5.1ch

      解像度
      1280×720

      コンテナ
      Matroska

      動画の長さ
      01:35:04.702

      ファイルサイズ 
      2.22 GB (2,384,909,126 バイト)

      PC環境
      Windows7 Home Premium
      Intel(R)Core(TM)i5-2450M CPU
      2.50Ghz
      RAM 8GB

      ツール
      X media Recoder

      こんな感じです

      niwakarabu
    8. ご報告ありがとうございます。

      まずファイルサイズ(2GB)からチェックしたのですが問題なく、もちろん4GBチェックも問題ないようです。

      あとは同様のコーデックや時間長でファイルを拵えてチェックすることになりますので、少々お待ちいただけますでしょうか。

      なお、L-SMASH Works r308を先ほどビルドして公開しましたので、よろしければ r308 または r312 でも同様の症状が出るかお試しください。

      L-SMASH Works r308
      L-SMASH Works r312

      POP
    9. はじめまして、いつも更新を楽しみにしております。

      AviutlでL-SMASH Worksを使った、24fps+60fpsの結合についてお聞きしたいのですが宜しいでしょうか?

      ■PC環境、使用ツール

      Windows7 Professional 64bit
      Aviutl 0.99m
      x264guiEx 1.62
      x264 r2230 64bit(L-SMASH)  POP様配布のもの
      L-SMASH Works r365  POP様配布のもの

      x264 r2230で出力したmp4動画(24fps,60fps どちらも音声ナシ)をL-SMASH Works r365で結合をすると、エクスプローラー上のアイコンにサムネが表示されなくなってしまいました。

      数日前まで使用していた r2216 64bit(L-SMASH) + L-SMASH Works r307での結合の頃には問題ありませんでした。

      その他に試した事
      r2216 + r308 24fps+60fps  サムネ表示されない
      r2230 + r307 24fps+60fps  Failed to oprn the input files. と表示されエクスポート出来ませんでした。
      r2230 + r308,r312,r354,r355,r356,r358 24fps+60fps  全てサムネ表示されない
      r2230 + r365 24fps+24fps  正常にサムネ表示される

      最新verの組み合わせで24+60のVFRの結合でサムネを表示する方法はあるのでしょうか?

      take
    10. > take さん

      はじめまして。
      同じ作業で再現チェックはしていないのですが、サムネイルが表示されない動画は再生が正常にできるのか否かが少々気になります。

      少し思い当たる節があるため、以下にx264とL-SMASH Worksのテストバイナリ(2組)を用意しました。大変お手数ですが、同じアーカイブに入っているバイナリ同士でエンコード及び結合を試していただけないでしょうか。よろしくお願いいたします。

      http://pop.4-bit.jp/bin/x264/test/x264-r2230_700t_x64_lsmash.zip
      http://pop.4-bit.jp/bin/x264/test/x264-r2230_703t_x64_lsmash.zip

      # 再現チェックは明日帰宅してからとなる予定です

      POP
    11. こんばんは、お返事ありがとうございます。

      まず、サムネが表示されない動画の再生についてですが。

      r2230 + r365 の、24+60+24のVFR + AAC(MP4Boxで追加)を再生させてみたところ…。

      VLC … 再生可能ですが、fpsが切り替わる箇所で、再生開始時と同様のタイトル(画面下段中央に ファイル名.mp4)が表示されます
      GOM … 再生可能
      ひまたん … 再生可能
      こめたん … 再生×、音も×
      WMP12 … 映像×、音のみ再生されます

      ※コーデック類はインストールしていません
      ※r2216 + r307 のVFR動画は全て再生可能です。

      という結果でした。

      次に新たに用意して下さった2つのzipでのエンコ+結合ですが、2種類ともにサムネ非表示で再生についても上記の結果と同様でした。

      再生に関する事が後出しになってしまい申し訳ありません。宜しくお願い致します。

      take
    12. > take さん

      ご報告ありがとうございます。
      当方で再現チェックをしてみたところ、それらは Haali Media Splitter(以下Haali)が原因かと思われ、どのプレイヤ・デコーダの組み合わせにおいても Haali を使用した場合に限り再現を確認しました。

      基本的に最近は Haali の使用を推奨しておらず、もしも Haali をお使いでしたら WMP12、MPC MP4/MOV Splitter、LAV など他のスプリッタをお使いいただけないでしょうか。

      ■回避方法
      1) Haaliをアンインストールする
      2) HaaliをインストールするときにMP4との関連付けを外す

      いずれかの方法でMP4コンテナの再生不具合は回避できますので、takeさんの環境で試していただけませんでしょうか。個人的には 1) のアンインストールをおすすめ致します。

      POP
    13. 報告が遅くなり申し訳ありません。

      スプリッタというものが何だか分からない状態からだったので少し時間がかかりましたが。
      LAVFilters-0.53.2.exeというものとWin7DSFilterTweaker_5.6.exeというものをインストールした結果、WMPなど前コメで再生不能のプレイヤーでも再生が可能になりました。

      しかし、サムネイルの非表示とVLCでのfpsが切り替わる箇所でのタイトル再度表示は改善されない状態です…

      行ったことは、LAVFiltersのインストール(インストール時のチェック項目、インストール後の設定は全てデフォルトのまま)の後、Win7DSFilterTweakerのMedia Foundationという項目の.mp4にチェックを入れただけなのですが、何か設定不足・間違え等はあるのでしょうか?

      take
    14. > takeさん

      Haaliでの現象以外についてご報告いただいた点を考えられる組み合わせすべてにおいて検証してみたところ、当方でも同様の再現に至りました。

      24fpsと60fpsに限らず、異なるフレームレートのMP4コンテナ(L-SMASHおよびGPACライブラリいずれも)を結合・出力すると

       1) エクスプローラでサムネイル表示不可
       2) VLCは結合部分でファイル名が再表示される
       3) Haaliなスプリッタだと再生不能

      となり、結合前それぞれのコンテナはL-SMASH、GPACライブラリに関係なく事象に至ることから L-SMASH Works 側の実装による可能性が高そうではあります。

      作者であるmuken氏をTwitterのタイムラインで見かけ次第声を掛けてみますが、対応方法やコード修正など進展がありましたら再報告させていただきます。

      POP
    15. お忙しい中、色々と検証して頂きありがとうございます。

      おかげ様で現状について理解が出来ました。
      進展に期待しつつ今後も閲覧させて貰いたいと思います。

      今回のやり取りを踏まえて、今後VFRの扱いをどうするか考え、また、これまで無頓着だった再生環境についても、これを機に勉強してみようと思います。

      この度は、回答をして頂き本当にどうもありがとうございました。

      take
    16. r307までの実装は邪道で、r308以降の実装が正当なものなので、r307までの実装に戻すことはありません。

      H.264ではフレームの復号に必要な基本情報をSPSとPPSに格納していますが、
      更にそれを特定のコンテナに入れる場合にはAVCConfigurationRecordというものにいくつか纏めて格納しています。
      で、
      r307: AVCConfigurationRecordが異なるシークエンスがあっても、最初のAVCConfigurationRecordだけを採用し、他は無視。(single sample descrition)
      308: AVCConfigurationRecordが異なるシークエンスがあれば、それぞれのAVCConfigurationRecordを無視せず、きちんと格納する。(multiple sample descriptions)

      r307の実装だと、AVCConfigurationRecordが異なるシークエンスがある場合、また、異なる部分が復号にクリティカルに影響する場合、demuxer/decoderの実装如何に関わらず、途中で再生できないファイルができてしまいます。
      r308の場合、demuxer/decoder側がきちんと対応していれば、再生出来るファイルが生成できます。

      ということなので、r308以降はmuxer側ではなく、demuxer/decoderに問題の全てを押し付ける形になったので、こちらとしてはどーにもなりません。
      こんなものも再生出来ないのか糞が!とお使いのdemuxer/decoderはたまたはplayerに、呪いの言葉を吐き付けるようにしましょう。

      ちなみに、今回問題となっている部分は異なるfpsをx264エンコーダに送りつけたということで、異なるtimebaseが生成され、SPSのVUI内のtime_scale乃至num_units_in_tickパラメータが異なるために生じている現象です。

      そもそも分割してエンコードしている時点でVBV ratecontrol encodingの恩恵を受けられないのですから、とりあえずfpsを騙ってエンコードしたとしても特に問題は起こらないはずです。
      結合前にfpsを変えればいいわけですから。

      これより、なんとかエンコード時にこのようなことが起こらないようにご自分で対処してください。

      muken
    17. > muken氏

      詳しい解説ありがとう!
      実装に関する知識が自分の中で曖昧だったのと、もしもの可能性を考慮してTwitterで見かけたら訊ねてみようかなと思っていたのだけど、非常にわかりやすい説明で自分としてもスッキリしました。

      > take さん

      後から結合するというやり方は自分の周りにも割といて、個人的にはエンコード時にタイムコードを適用してほしいな……と思いつつ、自身のやり方を押しつけるのもどうなんだという観点からあまり口を挟まないことにしているのですが、どうしても後から結合したい場合は──

       1) 結合後したMP4コンテナ映像を L-SMASH Works で読み込み、タイムコードを L-SMASH Dumper で書き出す
       2) 結合後の映像をrawストリームで書き出す(MP4Box等でextractする)
       3) 2)のrawストリームと1)のタイムコードを使ってL-SMASHでMP4コンテナへ再格納する

      という方法でとりあえずサムネイルもVLCでの表示も問題なくなりますが、見てのとおりバッチでも書いておかない限りかなり面倒だと思います。

      理想的にはエンコードする前にAviUtl上でタイムコードを手動編集・出力できるプラグイン(チャプター編集的なもののtimecode版)でもあればエンコード時のタイムコード適用も楽だとは思うのですが、ありそうでないので後から結合する方が多いのだという認識です。他のツールを使うとか併用しようという話は抜きで。

      POP
    18. 先日はお世話になりました。

      あれから数週間、本来でしたらすぐに(できました)報告とお礼のコメントをしたかったのですが、恥ずかしながら未だに上コメで書いて頂いた結合手順が成功できていません。。。

      ① L-SMASH Dumper でタイムコードを出力 → (○○.tmc)
      ② MP4Boxで “C:\MP4Box.exe” -raw 1 “F:\○○.mp4” → (○○_track1.h264)
      ③ コマンドプロンプトで L-SMASH の中にある timelineeditor.exe と①と②の再格納に関する記述をする → 正しい書き方が探せず失敗…又は根本的に間違っている?

      という感じで行き詰っています。非常に恐縮なのですが詳細をお教え頂けないでしょうか?

      take

    コメントを残す

    メールアドレスが公開されることはありません。

    2 × 5 =

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