AVIMAINHEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| fcc | DWORD | 4 | +0 | +0 | FOURCC コードを指定します。値は 'avih' でなければなりません。 |
| cb | DWORD | 4 | +4 | +4 | 構造体のサイズを指定します。先頭の 8 バイトは含みません。 |
| dwMicroSecPerFrame | DWORD | 4 | +8 | +8 | フレーム間のマイクロ秒数を指定します。この値はファイル全体のタイミングを示します。 |
| dwMaxBytesPerSec | DWORD | 4 | +12 | +12 | ファイルのおおよその最大データレートを指定します。この値は、メインヘッダーおよびストリームヘッダーの各チャンクに含まれる他のパラメーターで指定されたとおりに AVI シーケンスを再生するために、システムが 1 秒間に処理しなければならないバイト数を示します。 |
| dwPaddingGranularity | DWORD | 4 | +16 | +16 | データのアライメントをバイト単位で指定します。データはこの値の倍数になるようにパディングします。 |
| dwFlags | DWORD | 4 | +20 | +20 | 次のフラグの 0 個以上をビット単位で組み合わせた値を格納します。 |
| dwTotalFrames | DWORD | 4 | +24 | +24 | ファイル内のデータの総フレーム数を指定します。 |
| dwInitialFrames | DWORD | 4 | +28 | +28 | インターリーブされたファイルの初期フレームを指定します。インターリーブされていないファイルでは 0 を指定します。インターリーブされたファイルを作成する場合は、AVI シーケンスの初期フレームより前にファイル内に存在するフレーム数をこのメンバーに指定します。 オーディオドライバーが処理するのに十分なオーディオを与えるため、インターリーブされたファイル内のオーディオデータはビデオデータに対してずらす必要があります。通常、オーディオデータは約 0.75 秒分のオーディオデータを事前に読み込めるだけのフレーム数だけ前へ移動する必要があります。dwInitialRecords メンバーには、オーディオをずらしたフレーム数を設定します。また、オーディオストリームのストリームヘッダーにある AVISTREAMHEADER 構造体の dwInitialFrames メンバーにも同じ値を設定します。 |
| dwStreams | DWORD | 4 | +32 | +32 | ファイル内のストリーム数を指定します。たとえば、オーディオとビデオを含むファイルには 2 つのストリームがあります。 |
| dwSuggestedBufferSize | DWORD | 4 | +36 | +36 | ファイルを読み取るための推奨バッファーサイズを指定します。一般に、このサイズはファイル内で最大のチャンクを格納できる大きさにする必要があります。0 に設定した場合や小さすぎる場合、再生ソフトウェアは再生中にメモリを再割り当てしなければならず、パフォーマンスが低下します。インターリーブされたファイルの場合、バッファーサイズは 1 つのチャンクだけでなくレコード全体を読み取れる大きさにする必要があります。 |
| dwWidth | DWORD | 4 | +40 | +40 | AVI ファイルの幅をピクセル単位で指定します。 |
| dwHeight | DWORD | 4 | +44 | +44 | AVI ファイルの高さをピクセル単位で指定します。 |
| dwReserved | DWORD | 16 | +48 | +48 | 予約済みです。この配列は 0 に設定します。 |
公式ドキュメント
[このページに関連する機能である DirectShow はレガシー機能です。この機能は MediaPlayer、IMFMediaEngine、および Audio/Video Capture in Media Foundation に置き換えられました。これらの機能は Windows 10 および Windows 11 向けに最適化されています。Microsoft は、可能な場合は新しいコードで DirectShow ではなく MediaPlayer、IMFMediaEngine、Audio/Video Capture in Media Foundation を使用することを強く推奨します。また、レガシー API を使用している既存のコードについても、可能であれば新しい API を使用するように書き直すことを推奨します。]
AVIMAINHEADER 構造体は、AVI ファイル内のグローバルな情報を定義します。
解説(Remarks)
ヘッダーファイル Vfw.h では、この構造体と同等の MainAVIHeader 構造体が定義されていますが、fcc メンバーと cb メンバーは省かれています。
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 Structureimport 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