Win32 API 日本語リファレンス
ホームMedia.DirectShow › AVIMAINHEADER

AVIMAINHEADER

構造体
サイズx64: 64 バイト / x86: 64 バイトパッキング2

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
fccDWORD4+0+0FOURCC コードを指定します。値は 'avih' でなければなりません。
cbDWORD4+4+4構造体のサイズを指定します。先頭の 8 バイトは含みません。
dwMicroSecPerFrameDWORD4+8+8フレーム間のマイクロ秒数を指定します。この値はファイル全体のタイミングを示します。
dwMaxBytesPerSecDWORD4+12+12ファイルのおおよその最大データレートを指定します。この値は、メインヘッダーおよびストリームヘッダーの各チャンクに含まれる他のパラメーターで指定されたとおりに AVI シーケンスを再生するために、システムが 1 秒間に処理しなければならないバイト数を示します。
dwPaddingGranularityDWORD4+16+16データのアライメントをバイト単位で指定します。データはこの値の倍数になるようにパディングします。
dwFlagsDWORD4+20+20

次のフラグの 0 個以上をビット単位で組み合わせた値を格納します。

意味
AVIF_COPYRIGHTED
AVI ファイルに著作権で保護されたデータおよびソフトウェアが含まれていることを示します。このフラグが使用されている場合、ソフトウェアはデータの複製を許可すべきではありません。
AVIF_HASINDEX
AVI ファイルがインデックスを持つことを示します。
AVIF_ISINTERLEAVED
AVI ファイルがインターリーブされていることを示します。
AVIF_MUSTUSEINDEX
データの再生順序を決定する際に、アプリケーションがファイル内のチャンクの物理的な並び順ではなくインデックスを使用すべきであることを示します。たとえば、このフラグは編集用のフレーム一覧を作成するために使用できます。
AVIF_WASCAPTUREFILE
AVI ファイルが、リアルタイムのビデオをキャプチャするために特別に割り当てられたファイルであることを示します。ユーザーがこのファイルをあらかじめデフラグしている可能性が高いため、アプリケーションはこのフラグが設定されたファイルを上書きする前にユーザーへ警告する必要があります。
dwTotalFramesDWORD4+24+24ファイル内のデータの総フレーム数を指定します。
dwInitialFramesDWORD4+28+28

インターリーブされたファイルの初期フレームを指定します。インターリーブされていないファイルでは 0 を指定します。インターリーブされたファイルを作成する場合は、AVI シーケンスの初期フレームより前にファイル内に存在するフレーム数をこのメンバーに指定します。

オーディオドライバーが処理するのに十分なオーディオを与えるため、インターリーブされたファイル内のオーディオデータはビデオデータに対してずらす必要があります。通常、オーディオデータは約 0.75 秒分のオーディオデータを事前に読み込めるだけのフレーム数だけ前へ移動する必要があります。dwInitialRecords メンバーには、オーディオをずらしたフレーム数を設定します。また、オーディオストリームのストリームヘッダーにある AVISTREAMHEADER 構造体の dwInitialFrames メンバーにも同じ値を設定します。

dwStreamsDWORD4+32+32ファイル内のストリーム数を指定します。たとえば、オーディオとビデオを含むファイルには 2 つのストリームがあります。
dwSuggestedBufferSizeDWORD4+36+36ファイルを読み取るための推奨バッファーサイズを指定します。一般に、このサイズはファイル内で最大のチャンクを格納できる大きさにする必要があります。0 に設定した場合や小さすぎる場合、再生ソフトウェアは再生中にメモリを再割り当てしなければならず、パフォーマンスが低下します。インターリーブされたファイルの場合、バッファーサイズは 1 つのチャンクだけでなくレコード全体を読み取れる大きさにする必要があります。
dwWidthDWORD4+40+40AVI ファイルの幅をピクセル単位で指定します。
dwHeightDWORD4+44+44AVI ファイルの高さをピクセル単位で指定します。
dwReservedDWORD16+48+48予約済みです。この配列は 0 に設定します。

公式ドキュメント

[このページに関連する機能である DirectShow はレガシー機能です。この機能は MediaPlayerIMFMediaEngine、および Audio/Video Capture in Media Foundation に置き換えられました。これらの機能は Windows 10 および Windows 11 向けに最適化されています。Microsoft は、可能な場合は新しいコードで DirectShow ではなく MediaPlayerIMFMediaEngineAudio/Video Capture in Media Foundation を使用することを強く推奨します。また、レガシー API を使用している既存のコードについても、可能であれば新しい API を使用するように書き直すことを推奨します。]

AVIMAINHEADER 構造体は、AVI ファイル内のグローバルな情報を定義します。

解説(Remarks)

ヘッダーファイル Vfw.h では、この構造体と同等の MainAVIHeader 構造体が定義されていますが、fcc メンバーと cb メンバーは省かれています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// AVIMAINHEADER  (x64 64 / x86 64 バイト)
#pragma pack(push, 2)
typedef struct AVIMAINHEADER {
    DWORD fcc;
    DWORD cb;
    DWORD dwMicroSecPerFrame;
    DWORD dwMaxBytesPerSec;
    DWORD dwPaddingGranularity;
    DWORD dwFlags;
    DWORD dwTotalFrames;
    DWORD dwInitialFrames;
    DWORD dwStreams;
    DWORD dwSuggestedBufferSize;
    DWORD dwWidth;
    DWORD dwHeight;
    DWORD dwReserved[4];
} AVIMAINHEADER;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]
public struct AVIMAINHEADER
{
    public uint fcc;
    public uint cb;
    public uint dwMicroSecPerFrame;
    public uint dwMaxBytesPerSec;
    public uint dwPaddingGranularity;
    public uint dwFlags;
    public uint dwTotalFrames;
    public uint dwInitialFrames;
    public uint dwStreams;
    public uint dwSuggestedBufferSize;
    public uint dwWidth;
    public uint dwHeight;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] dwReserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=2, CharSet:=CharSet.Unicode)>
Public Structure AVIMAINHEADER
    Public fcc As UInteger
    Public cb As UInteger
    Public dwMicroSecPerFrame As UInteger
    Public dwMaxBytesPerSec As UInteger
    Public dwPaddingGranularity As UInteger
    Public dwFlags As UInteger
    Public dwTotalFrames As UInteger
    Public dwInitialFrames As UInteger
    Public dwStreams As UInteger
    Public dwSuggestedBufferSize As UInteger
    Public dwWidth As UInteger
    Public dwHeight As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public dwReserved() As UInteger
End Structure
import ctypes
from ctypes import wintypes

class AVIMAINHEADER(ctypes.Structure):
    _pack_ = 2
    _fields_ = [
        ("fcc", wintypes.DWORD),
        ("cb", wintypes.DWORD),
        ("dwMicroSecPerFrame", wintypes.DWORD),
        ("dwMaxBytesPerSec", wintypes.DWORD),
        ("dwPaddingGranularity", wintypes.DWORD),
        ("dwFlags", wintypes.DWORD),
        ("dwTotalFrames", wintypes.DWORD),
        ("dwInitialFrames", wintypes.DWORD),
        ("dwStreams", wintypes.DWORD),
        ("dwSuggestedBufferSize", wintypes.DWORD),
        ("dwWidth", wintypes.DWORD),
        ("dwHeight", wintypes.DWORD),
        ("dwReserved", wintypes.DWORD * 4),
    ]
#[repr(C, packed(2))]
pub struct AVIMAINHEADER {
    pub fcc: u32,
    pub cb: u32,
    pub dwMicroSecPerFrame: u32,
    pub dwMaxBytesPerSec: u32,
    pub dwPaddingGranularity: u32,
    pub dwFlags: u32,
    pub dwTotalFrames: u32,
    pub dwInitialFrames: u32,
    pub dwStreams: u32,
    pub dwSuggestedBufferSize: u32,
    pub dwWidth: u32,
    pub dwHeight: u32,
    pub dwReserved: [u32; 4],
}
import "golang.org/x/sys/windows"

type AVIMAINHEADER struct {
	fcc uint32
	cb uint32
	dwMicroSecPerFrame uint32
	dwMaxBytesPerSec uint32
	dwPaddingGranularity uint32
	dwFlags uint32
	dwTotalFrames uint32
	dwInitialFrames uint32
	dwStreams uint32
	dwSuggestedBufferSize uint32
	dwWidth uint32
	dwHeight uint32
	dwReserved [4]uint32
}
type
  AVIMAINHEADER = packed record
    fcc: DWORD;
    cb: DWORD;
    dwMicroSecPerFrame: DWORD;
    dwMaxBytesPerSec: DWORD;
    dwPaddingGranularity: DWORD;
    dwFlags: DWORD;
    dwTotalFrames: DWORD;
    dwInitialFrames: DWORD;
    dwStreams: DWORD;
    dwSuggestedBufferSize: DWORD;
    dwWidth: DWORD;
    dwHeight: DWORD;
    dwReserved: array[0..3] of DWORD;
  end;
const AVIMAINHEADER = extern struct {
    fcc: u32,
    cb: u32,
    dwMicroSecPerFrame: u32,
    dwMaxBytesPerSec: u32,
    dwPaddingGranularity: u32,
    dwFlags: u32,
    dwTotalFrames: u32,
    dwInitialFrames: u32,
    dwStreams: u32,
    dwSuggestedBufferSize: u32,
    dwWidth: u32,
    dwHeight: u32,
    dwReserved: [4]u32,
};
type
  AVIMAINHEADER {.packed.} = object
    fcc: uint32
    cb: uint32
    dwMicroSecPerFrame: uint32
    dwMaxBytesPerSec: uint32
    dwPaddingGranularity: uint32
    dwFlags: uint32
    dwTotalFrames: uint32
    dwInitialFrames: uint32
    dwStreams: uint32
    dwSuggestedBufferSize: uint32
    dwWidth: uint32
    dwHeight: uint32
    dwReserved: array[4, uint32]
align(2)
struct AVIMAINHEADER
{
    uint fcc;
    uint cb;
    uint dwMicroSecPerFrame;
    uint dwMaxBytesPerSec;
    uint dwPaddingGranularity;
    uint dwFlags;
    uint dwTotalFrames;
    uint dwInitialFrames;
    uint dwStreams;
    uint dwSuggestedBufferSize;
    uint dwWidth;
    uint dwHeight;
    uint[4] dwReserved;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; AVIMAINHEADER サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; fcc : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; cb : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwMicroSecPerFrame : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwMaxBytesPerSec : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwPaddingGranularity : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwFlags : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwTotalFrames : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dwInitialFrames : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; dwStreams : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; dwSuggestedBufferSize : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; dwWidth : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwHeight : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; dwReserved : DWORD (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global AVIMAINHEADER, pack=2
    #field int fcc
    #field int cb
    #field int dwMicroSecPerFrame
    #field int dwMaxBytesPerSec
    #field int dwPaddingGranularity
    #field int dwFlags
    #field int dwTotalFrames
    #field int dwInitialFrames
    #field int dwStreams
    #field int dwSuggestedBufferSize
    #field int dwWidth
    #field int dwHeight
    #field int dwReserved 4
#endstruct

stdim st, AVIMAINHEADER        ; NSTRUCT 変数を確保
st->fcc = 100
mes "fcc=" + st->fcc