カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

mpegに関連する構造体

このセクションではmpegに関連する構造体を2つ取り上げます。以下に支援するバージョンとレイヤーを示します。守備範囲の違いに注意して下さい。

構造体 バージョン レイヤー 説明
  1 2・2.5 I・II III  
MPEG1WAVEFORMAT × mpegバージョン1のオーディオを扱うために拡張されたWAVEFORMAT構造体です。DirectShowのフィルターなどで用います。
MPEGLAYER3WAVEFORMAT × mpegオーディオレイヤー3(mp3)を扱うために拡張されたWAVEFORMAT構造体です。mp3ファイルをacm関数を用いて再生する場合などに使います。

MPEG1WAVEFORMAT

DirectShowによってMPEGバージョン1のオーディオを再生する場合、WAVEFORMAT構造体で示される情報に加え、レイヤー・ビットレートなどmpegファイルのフレームヘッダーに書かれている情報にアクセスすることができます。

この構造体で使われる数値(レイヤーやチャンネルモードなど)は、フレームヘッダーに記録されている数値と異なります。直接代入はできませんの注意して下さい。

以下にMPEG1WAVEFORMAT構造体を示します。

typedef struct mpeg1waveformat_tag {
    WAVEFORMATEX    wfx;
    WORD            fwHeadLayer;
    DWORD           dwHeadBitrate;
    WORD            fwHeadMode;
    WORD            fwHeadModeExt;
    WORD            wHeadEmphasis;
    WORD            fwHeadFlags;
    DWORD           dwPTSLow;
    DWORD           dwPTSHigh;
} MPEG1WAVEFORMAT;

wfx.wFormatTag

mpegを扱うため、必ず「WAVE_FORMAT_MPEG」を指定します。

wfx.nChannels

チャンネル数を指定します。MONO=1、STEREO=2。

wfx.nSamplesPerSec

サンプリング周波数を指定します。サンプリング周波数が可変の場合は「0」を指定します。

wfx.nAvgBytesPerSec

1秒間に消費するデータサイズを指定します。ビットレートを8で割った値になります。ただし可変ビットレートの場合、正しい数値が反映されないことがあります。

nBlockSize

フレームサイズを指定します。フレームサイズは以下の式で求めることができます。ただし、ビットレートが可変の場合、サンプリング周波数が44100Hzの場合は、「1」を指定します。

レイヤーI

    WORD flameSize = (12 * bitRate / samplesPerSec) * 4;

レイヤーII・レイヤーIII

    WORD flameSize = 144 * bitRate / samplesPerSec;
パッディングは演奏情報ではないので、ここの計算ではパッディングを加えません。

wfx.wBitsPerSample

サンプルあたりのビット数は定義されないので「0」を指定します。

wfx.cbSize

MPEG1WAVEFORMAT用の拡張サイズです。「22」を指定します。

fwHeadLayer

レイヤーを示します。複数のレイヤーを含む場合は、表記のORを取ります。

フレームヘッダーの値 レイヤー 表記 fwHeadLayerの値
3 レイヤーI ACM_MPEG_LAYER1 0x0001
2 レイヤーII ACM_MPEG_LAYER2 0x0002
1 レイヤーIII ACM_MPEG_LAYER3 0x0004

dwHeadBitrate

ビットレートを指定します。この数値はテーブルへのインデックスではなく、実際の数値を指定します。ビットレートが可変の場合や標準ではない場合は「0」を指定します。

fwHeadMode

チャンネルモードを示します。複数のチャンネルモードを含む場合は、表記のORを取ります。

フレームヘッダーの値 チャンネルモード 表記 fwHeadModeの値
0 ステレオ ACM_MPEG_STEREO 0x0001
1 ジョイントステレオ ACM_MPEG_JOINTSTEREO 0x0002
2 デュアルチャンネル ACM_MPEG_DUALCHANNEL 0x0004
3 シングルチャンネル ACM_MPEG_SINGLECHANNEL 0x0008

fwHeadModeExt

モード拡張を示します。チャンネルモードがジョイントステレオの時のみ有効です。それ以外はゼロを指定します。通常エンコーダーはチャンネルモードを動的に切り替えるので、すべての数値のORを取った値「0x000F」を指定します。

  レイヤー I・レイヤー II レイヤー III  
フレームヘッダーの値 Iステレオ Iステレオ MSステレオ fwHeadModeExtの値
0 帯域 4 〜 31 off off 0x0001
1 帯域 8 〜 31 on off 0x0002
2 帯域 12 〜 31 off on 0x0004
3 帯域 16 〜 31 on on 0x0008
ヘッダーファイルにこの項目を表現する表記は用意されていません。直接数値を使って下さい。

wHeadEmphasis

デコーダに必要なデエンファシスを指定します。

フレームヘッダーの値 デエンファシス wHeadEmphasisの値
0 なし 1
1 50/15 ms 2
2 未使用 3
3 CCIT J.17 4

fwHeadFlags

各種のフラグを指定します。

表記 fwHeadFlagsの値 説明
ACM_MPEG_PRIVATEBIT 0x0001 プライベート
ACM_MPEG_COPYRIGHT 0x0002 著作権あり
ACM_MPEG_ORIGINALHOME 0x0004 オリジナル
ACM_MPEG_PROTECTIONBIT 0x0008 16ビットのCRC誤り検出を支援
ACM_MPEG_ID_MPEG1 0x0010 mpeg1オーディオストリームであることを示す

dwPTSLow

プレゼンテーションタイムスタンプ(PTS)の下位32ビットを示します。PTSはオーディオ・ビデオの提示時刻を示す情報です。

dwPTSHigh

プレゼンテーションタイムスタンプの(PTS)上位32ビットを示します。

使用例

以下はDirectShowのフィルターで使われるCheckInputType()関数の例です。

CheckInputType()関数の中でフォーマットタグがWAVE_FORMAT_MPEGの時、MPEG1WAVEFORMAT構造体を使うことができます。

HRESULT CMyIpAudio::CheckInputType(const CMediaType *pmt)
{
    CheckPointer(pmt, E_POINTER);

    if (pmt->majortype != MEDIATYPE_Audio)          return VFW_E_TYPE_NOT_ACCEPTED;
    if (pmt->formattype != FORMAT_WaveFormatEx)     return VFW_E_TYPE_NOT_ACCEPTED;

    WAVEFORMATEX *pwfx = (WAVEFORMATEX*)pmt->pbFormat;

    if (pwfx->wFormatTag == WAVE_FORMAT_MPEG)
    {
        // mpegの処理
        MPEG1WAVEFORMAT *pmp1wf = (MPEG1WAVEFORMAT*)pmt->pbFormat;
    }
    else if (pwfx->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
    {
        // フォーマットタグがWAVE_FORMAT_MPEGLAYER3の場合、
        // MPEGLAYER3WAVEFORMAT構造体を使うことも可能です。
        MPEGLAYER3WAVEFORMAT* pmp3wf = (MPEGLAYER3WAVEFORMAT*)pmt->pbFormat;
    }
    else if (pwfx->wFormatTag == WAVE_FORMAT_PCM)
    {
        // 通常のウェーブファイルとして処理する
    }
    ...

使用例の詳しい説明は、DirectShowのカスタムフィルターのセクションを参照して下さい。

MPEGLAYER3WAVEFORMAT

MPEGLAYER3WAVEFORMATはmpegオーディオレイヤーIIIを扱うための構造体です。以下に詳細を示します。

typedef struct mpeglayer3waveformat_tag {
  WAVEFORMATEX  wfx;
  WORD          wID;
  DWORD         fdwFlags;
  WORD          nBlockSize;
  WORD          nFramesPerBlock;
  WORD          nCodecDelay;
} MPEGLAYER3WAVEFORMAT;

wfx.cbSize

MPEGLAYER3WAVEFORMAT用の拡張サイズです。「MPEGLAYER3_WFX_EXTRA_BYTES」を指定します。

wfx.nChannels

チャンネル数を指定します。MONO=1、STEREO=2。

wfx.wFormatTag

mp3を扱います。「WAVE_FORMAT_MPEGLAYER3」を指定します。

wfx.nBlockAlign

1を指定します。

wfx.wBitsPerSample

サンプルあたりのビット数は定義されないので0を指定します。

wfx.nSamplesPerSec

サンプリング周波数を指定します。

wfx.nAvgBytesPerSec

1秒間に消費するデータサイズを指定します。ビットレートを8で割った値になります。

wID

「MPEGLAYER3_ID_MPEG」を指定します。

fdwFlags

パッディングを挿入するかどうかを示すフラグです。

フラグ パッディング
MPEGLAYER3_FLAG_PADDING_ISO 必要に応じて挿入する
MPEGLAYER3_FLAG_PADDING_ON 常に挿入する
MPEGLAYER3_FLAG_PADDING_OFF 挿入しない

nBlockSize

ブロックサイズを指定します。ブロックサイズは「フレームサイズ×nFramesPerBlock」に等しく、以下の式で求めることができます。

バージョン1

    WORD frameSize = (144 * bitRate / samplesPerSec) + padding;
    nBlockSize = frameSize * nFramesPerBlock;

バージョン2・バージョン2.5

    WORD frameSize = (72 * bitRate / samplesPerSec) + padding;
    nBlockSize = frameSize * nFramesPerBlock;
フレームサイズを直接ブロックサイズに代入しているコードが多く見られますが、nFramesPerBlockを「1」固定にしているため、という事を忘れないで下さい。

nFramesPerBlock

1つのブロックに納めるフレーム数を指定します。ブロックとフレームを一対一で対応させた方が扱いが楽なので、通常1を指定します。1つのブロックに複数のフレームを納める場合は、nBlockSizeの計算に注意して下さい。

nCodecDelay

1393(0x571)を指定します。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ