Создание нового объекта заголовка ASF
Чтобы преобразовать сведения, содержащиеся в объекте ContentInfo, в двоичный формат объекта заголовка ASF, приложение должно вызвать IMFASFContentInfo::GenerateHeader. Этот вызов необходимо выполнить после создания пакетов данных, а объект ContentInfo содержит обновленные сведения. GenerateHeader возвращает указатель на буфер мультимедиа, содержащий сведения о заголовке в допустимом формате. Затем приложение может записать данные, на которые указывает буфер мультимедиа, в начало нового файла ASF.
Создание нового объекта заголовка с помощью объекта ContentInfo
Вызовите MFCreateASFContentInfo для создания пустого объекта ContentInfo.
Вызовите IMFASFContentInfo::SetProfile, чтобы предоставить объект профиля объекту ContentInfo. Сведения о создании профилей см. Создание профиля ASF.
Вызовите IMFASFContentInfo::GenerateHeader, передайте NULL в параметр pIHeader и получите размер заполненного объекта ContentInfo в параметре pcbHeader. Приложение может использовать это значение для выделения памяти или буфера мультимедиа, содержащего объект заголовка.
Размер заголовка, полученный, включает размер заполнения, который настраивается в зависимости от фактического размера объектов заголовка. Максимальный размер объектов заголовка составляет 10 МБ. Если размер превышает это значение, GenerateHeader завершается ошибкой MF_E_ASF_INVALIDDATA.
Вызовите MFCreateMemoryBuffer, чтобы создать буфер мультимедиа полученного размера на шаге 3.
Вызовите GenerateHeader еще раз, чтобы создать новый объект заголовка ASF из объекта ContentInfo в буфере мультимедиа, созданном на шаге 4.
Длина данных в буфере мультимедиа обновляется, а новый размер возвращается в параметре pcbHeader.
Напишите содержимое буфера мультимедиа в начале файла. Приложение может использовать поток байтов для выполнения операции записи. Пример кода см. в разделе IMFByteStream::Write.
Пример
В следующем примере кода показано, как создать объект ContentInfo и создать буфер мультимедиа для хранения нового объекта заголовка. Полный пример использования этого кода см. в руководстве по . Копирование потоков 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;
}
Связанные разделы