3

独自のビデオ ファイル形式を作成しており、ファイル ヘッダーとフレーム ヘッダーを書き出したいと考えています。

現時点では、次のように定義されたプレースホルダーがあります。

byte[] fileHeader = new byte[FILE_HEADER_SIZE * sizeof(int)];
byte[] frameHeader = new byte[FRAME_HEADER_SIZE * sizeof(int)];

ファイルヘッダーに次を使用してそれらを書き出します。

fsVideoWriter.Write(fileHeader, 0, FILE_HEADER_SIZE);

フレームヘッダーの場合は次のとおりです。

fsVideoWriter.Write(frameHeader, 0, FRAME_HEADER_SIZE);

これらのヘッダーを実際に適切に使用する必要があるので、個別に必要な個々のフィールドで読みやすいかどうかわからないため、これがヘッダーを書き込む最も便利な方法であるかどうかはわかりませんヘッダーからの変数。

私は次のようなことをすることを考えました:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct FileHeader
{
    public int x;
    public int y;
    public int z;
            // etc. etc.
}

ファイル形式が進化するにつれて簡単にアップグレードできるように定義したいと思います (つまり、バージョン番号を含めます)。これは、ファイル/フレーム ヘッダーを定義するための推奨される方法ですか? もしそうなら、.NET FileStream クラスを使用してどのように読み書きする必要がありますか? これが推奨される方法でない場合は、これを行う適切な方法を提案してください。誰かがこの種のことを処理する一般的なビデオ ファイル関連のクラスを既に作成している可能性があります。

4

2 に答える 2

1

私は次の解決策に落ち着きました:

ファイルヘッダーの書き出し

public static bool WriteFileHeader(FileStream fileStream, FileHeader fileHeader)
{
    try
    {
        byte[] buffer = new byte[FILE_HEADER_SIZE];

        GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        Marshal.StructureToPtr(fileHeader, gch.AddrOfPinnedObject(), false);
        gch.Free();

        fileStream.Seek(0, SeekOrigin.Begin);                
        fileStream.Write(buffer, 0, FILE_HEADER_SIZE);

        return true;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

ファイルヘッダーの読み取り

public static bool ReadFileHeader(FileStream fileStream, out FileHeader fileHeader)
{
    try
    {
        fileHeader = new FileHeader();

        byte[] buffer = new byte[FILE_HEADER_SIZE];

        fileStream.Seek(0, SeekOrigin.Begin);
        fileStream.Read(buffer, 0, FILE_HEADER_SIZE);

        GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        Marshal.PtrToStructure(gch.AddrOfPinnedObject(), fileHeader);

        gch.Free();

        // test for valid data
        boolean isSuccessful = IsValidHeader(fileHeader);

        return isSuccessful;

    }
    catch (Exception ex)
    {
        throw ex;
    }

}

フレームヘッダーにも同様のアプローチを使用しました。基本的には、バイト バッファとマーシャルを利用するという考え方です。

于 2013-09-04T18:17:00.690 に答える