誕生日にもらった意外なもの

お世話になります。

ExcelVBAでファイルを検索するシステムを作成しています。
ここで検索するファイルはMPEG2限定なのですが、「ユリードビジオスタジオ」で作成されたMPEG2のファイルでも、「真空波動研」等で調べると実はMPEG1だった・・・。というファイルが存在し難航しています。(逆の場合もあります。MPEG1で作ったのに、実はMPEG2だった・・。)
多分内部的な規格の違いによるものだと思います。

最初はバイナリエディタ等でヘッダ情報を取得していたのですが、
ヘッダ情報だけでは判断できそうに有りません。

このファイルはMPEG1として作られたのか、MPEG2として作られたのかを判断する方法をどなたかご教授下さい。

ちなみにここで言うMPEG2の基準としては、WinMediaPlayerのVrt 6.4で再生できないファイルを指します。

A 回答 (3件)

過去にAVIファイルの構造を解析したことがあります。


AVIファイルにはヘッダーに細かく情報が記載されているのですが、
MPEGにはそういう情報はないのですか。

バイナリエディタでみたようですが、
よろしければどのような構造になっているのか教えて下さい。

基本的にMPEG1とMPEG2は圧縮技術としてはほぼ同じものです。
ただ、Mpeg2はおそろしいほど拡張性があります。

例えば、MPEG2はインターレース、VBRに対応していますし、
ハイビジョン用などに11種類のプロファイルが制定されています。

エンコードの方式もフィルタも自在に組み込めますので、
メーカ各社も独自のエンコーダを持っています。

おそらくはこういった付加情報を基に判断するしかないのかもしれません。。。

>ユリードビジオスタジオ」で作成されたMPEG2のファイルでも
>「真空波動研」等で調べると実はMPEG1

これも謎の多い文書です。

ユリードのバージョンが古いせいなのかタコなのか、
はたまたMpgg2の作成条件がたまたまMpeg1の規格にはまってしまったのか・・・

前後の記述からして、
このファイルはメディアプレイヤ6.4で再生可能なのでしょう?
    • good
    • 0
この回答へのお礼

hawkwind様。
お返事ありがとうございました。

(1)まず、依頼主が、「ユリードビジオスタジオ」というソフトを使用し、MPEG1、MPEG2のmpgファイルを作成しています。
(作成方法は私にも良く解りません・・。)
(2)その中で、MPEG2のファイルのみを探し出すプログラムをExcelマクロで作成。(内部的には、まず拡張子が*.mpgのファイルを取得し、その中でもMPEG2のファイル一覧を出すというものです。)
バイナリエディタでこれらのファイルをみると、

ASSRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C
00000000 00 00 01 B3 2D 01 E0 C4 04 E2 21 70 00
00000010 00 08 00 40 00 00 01 00 00 0B 78 80 00


00049130 00 00 00 00 00 00 00 00 00 00 00 00 00

↑こんな感じになるのですが、最初は[00000000]の頭5バイト分の情報を取得し、これが[00][00][01][BA][44]になっていればMPEG2だ!という判断をしていたのですが、
(参考資料リンク:http://b2ch.at.infoseek.co.jp/dump.html#menu
いざテストしてみると、上記パターン以外にもMPEG2のパターンがある事が解りました。

>「ユリードビジオスタジオ」で作成されたMPEG2のファイルでも「真空波動研」等で調べると実はMPEG1これも謎の多い文書です。

これは、依頼主が、「ユリードビジオスタジオ」でのファイルの作成過程で、「このファイルはMPEG1だ!」「このファイルはMPEG2だ!」と決めることが出来るらしいのですが、実際フリーのコーデック調査ソフト「真空波動研」でこれらを再生すると、依頼者は「MPEG2だ!」と言っているファイルが明らかに「真空波動研」上だと"MPEG1"と判断されてるんです(^^;)。(逆も有り)

>ユリードのバージョンが古いせいなのかタコなのか、
>はたまたMpgg2の作成条件がたまたまMpeg1の規格にはまってしまったのか・・・

hawkwind様のおっしゃる通り、後者の可能性が高いと思います。

逆に、VBA上から、MediaPlayerクラスで、どのフィルタを使っているのか?という情報は取得出来るものなのでしょうか?

お礼日時:2005/12/21 14:41

パックヘッダ(00 00 01 BA)の最初バイトが


上位4bitが0010がMPEG1
上位2bitが01がMPEG2
です。
なんらかのデータ(タグ等)が付加されてる可能性もあるので、先頭からというのは不味いかもしれません。

真空波動研は多重化されてないビデオのみのファイル(エレメンタリーストリーム、ビデオの場合00 00 01 B3で始まってると思います。)、拡張子だけ見て判断みたいですので、あてにならないと思います。
(拡張子をaaaなどにして、調べると未対応形式になると思います。)

この場合、ビデオシーケンスヘッダ(00 00 01 B3)の後に、拡張ヘッダ(00 00 01 B5)がくれば、MPEG2なんですが、ビデオシーケンスヘッダが可変長ですので注意。

長くても139Byteなので、ビデオシーケンスヘッダから150Byte以内に、00 00 01 B5を発見したらMPEG2とかでもそう問題ない気もしますが。

http://www.andrewduncan.ws/MPEG/MPEG-1_Picts.html
http://www.andrewduncan.ws/MPEG/MPEG-2_Picts.html
    • good
    • 1
この回答へのお礼

PCの調子が悪く、返答が遅くなり大変申し訳御座いません!!何とか解決いたしました。有難う御座いました。

お礼日時:2005/12/28 09:59

>[00][00][01][BA][44]になっていればMPEG2だ!という判断



さすがにこれは無茶がありすぎです^^;

MPEGの仕様はここが詳しいようです。
http://www.pioneer.co.jp/crdl/tech/mpeg/3.html

先頭5バイトはパックヘッダーとよばれる部分の一部で、
とてもコーデックの情報を取得できるようにはみえません。

おそらくはシステムヘッダーの部分が該当すると思われます。
私もバイナリエディタでみてみましたが、パッと見では把握できませんでした。

WEB上でこの部分について記述しているサイトも30分ほど探してみましたが、
これといったサイトは見つかりませんでした。
どうやら専門書を購入する方が話は早いようです。

>MediaPlayerクラスでフィルタの情報は取得可能か

XP機から搭載されているGDI+(GDI32の後継)ならば
ImageCodecInfoクラスを用いて取得可能とのことです。

Windows98やNetFrameWorkがない環境では自前で
取得プログラムを用意する必要があるのではないでしょか。
(グレープシティにはこういうのが確実にあるのでしょうね)

http://www.atmarkit.co.jp/fdotnet/dotnettips/022 …
    • good
    • 0
この回答へのお礼

hawkwind様。
お忙しい中、色々と調べて頂きありがとうございますm(__)m。

やはり5バイト分だけでは情報としては少なすぎますか(^^;)
最終的に、依頼主より「MPEG1以外のファイルを見つけてもらえればよい」という仕様に変わりましたので、フィルターグラフマネージャーというクラス(?)を使用して、そのMPEGファイルを再生させる時に、どのフィルタを使うか?・・という条件で、MPEG1かそうでないか(MPEG2)を判断することにしました。ここで、フィルタの一覧の中に、"MPEG-I Stream Splitter"というフィルタがあれば、MPEG1であるし、そうでなければ、MPEG1以外のファイルだ・・という結論にいたりました。

ただそうなると、今度は「DirectX」なるもののバージョンを調べる必要があるようなのですが(参照:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1852105)、ここでまた難航してしまっています・・。
自分でも色々と調べてはいるのですが、もしお時間がおありでしたら、是非、この若輩者に知恵をお貸し下さい。

本当にありがとうございました!!

お礼日時:2005/12/22 08:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報