새 ASF 헤더 개체 생성

ContentInfo 개체에 포함된 정보를 이진 ASF 헤더 개체 형식으로 변환하려면 애플리케이션에서 IMFASFContentInfo::GenerateHeader를 호출해야 합니다. 이 호출은 데이터 패킷이 생성되고 ContentInfo 개체에 업데이트된 정보가 포함된 후에 수행해야 합니다. GenerateHeader 는 헤더 정보를 유효한 형식으로 포함하는 미디어 버퍼에 대한 포인터를 반환합니다. 그런 다음, 애플리케이션은 새 ASF 파일의 시작 부분에 미디어 버퍼가 가리키는 데이터를 작성할 수 있습니다.

ContentInfo 개체를 사용하여 새 Header 개체를 작성하려면

  1. MFCreateASFContentInfo를 호출하여 빈 ContentInfo 개체를 만듭니다.

  2. IMFASFContentInfo::SetProfile을 호출하여 ContentInfo 개체에 프로필 개체를 제공합니다. 프로필을 만드는 방법에 대한 자세한 내용은 ASF 프로필 만들기를 참조하세요.

  3. IMFASFContentInfo::GenerateHeader를 호출하고 pIHeader 매개 변수에서 NULL을 전달하고 pcbHeader 매개 변수에서 채워진 ContentInfo 개체의 크기를 받습니다. 애플리케이션은 이 값을 사용하여 Header 개체를 포함할 메모리 또는 미디어 버퍼를 할당할 수 있습니다.

    받은 헤더 크기에는 헤더 개체의 실제 크기에 따라 조정되는 안쪽 여백 크기가 포함됩니다. 헤더 개체의 최대 크기는 10MB입니다. 크기가 이 값을 초과하면 generateHeader 가 실패하고 MF_E_ASF_INVALIDDATA 오류가 발생합니다.

  4. MFCreateMemoryBuffer를 호출하여 3단계에서 받은 크기의 미디어 버퍼를 만듭니다.

  5. GenerateHeader를 다시 호출하여 4단계에서 만든 미디어 버퍼의 ContentInfo 개체에서 새 ASF 헤더 개체를 생성합니다.

    미디어 버퍼의 데이터 길이가 업데이트되고 새 크기가 pcbHeader 매개 변수에 반환됩니다.

  6. 파일의 시작 부분에 미디어 버퍼의 내용을 씁니다. 애플리케이션은 바이트 스트림을 사용하여 쓰기 작업을 수행할 수 있습니다. 예제 코드는 IMFByteStream::Write를 참조하세요.

예제

다음 예제 코드에서는 ContentInfo 개체를 만들고 미디어 버퍼를 생성하여 새 Header 개체를 저장하는 방법을 보여 있습니다. 이 코드를 사용하는 전체 예제는 자습서: 한 파일에서 다른 파일로 ASF 스트림 복사를 참조하세요.

//-------------------------------------------------------------------
// WriteASFFile
//
// Writes the complete ASF file.
//-------------------------------------------------------------------

HRESULT WriteASFFile( 
    IMFASFContentInfo *pContentInfo, // ASF Content Info for the output file.
    IMFByteStream *pDataStream,      // Data stream.
    PCWSTR pszFile                   // Output file name.
    )
{
    
    IMFMediaBuffer *pHeaderBuffer = NULL;
    IMFByteStream *pWmaStream = NULL;

    DWORD cbHeaderSize = 0;
    DWORD cbWritten = 0;

    // Create output file.
    HRESULT hr = MFCreateFile(
        MF_ACCESSMODE_WRITE, 
        MF_OPENMODE_DELETE_IF_EXIST,
        MF_FILEFLAGS_NONE,
        pszFile,
        &pWmaStream
        );

    // Get the size of the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(NULL, &cbHeaderSize);
    }

    // Create a media buffer.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateMemoryBuffer(cbHeaderSize, &pHeaderBuffer);
    }

    // Populate the media buffer with the ASF Header Object.
    if (SUCCEEDED(hr))
    {
        hr = pContentInfo->GenerateHeader(pHeaderBuffer, &cbHeaderSize);
    }
 
    // Write the header contents to the byte stream for the output file.
    if (SUCCEEDED(hr))
    {
        hr = WriteBufferToByteStream(pWmaStream, pHeaderBuffer, &cbWritten);
    }

    if (SUCCEEDED(hr))
    {
        hr = pDataStream->SetCurrentPosition(0);
    }

    // Append the data stream to the file.

    if (SUCCEEDED(hr))
    {
        hr = AppendToByteStream(pDataStream, pWmaStream);
    }

    SafeRelease(&pHeaderBuffer);
    SafeRelease(&pWmaStream);

    return hr;
}

새 파일에 대한 ASF 헤더 개체 작성