Generieren eines neuen ASF-Headerobjekts
Um die im ContentInfo-Objekt enthaltenen Informationen in ein binäres ASF-Headerobjektformat zu konvertieren, muss die Anwendung IMFASFContentInfo::GenerateHeader aufrufen. Dieser Aufruf muss erfolgen, nachdem die Datenpakete generiert wurden und das ContentInfo-Objekt aktualisierte Informationen enthält. GenerateHeader gibt einen Zeiger auf einen Medienpuffer zurück, der die Headerinformationen im gültigen Format enthält. Die Anwendung kann dann die Daten schreiben, auf die der Medienpuffer verweist, am Anfang einer neuen ASF-Datei.
So schreiben Sie ein neues Headerobjekt mithilfe des ContentInfo-Objekts
Rufen Sie MFCreateASFContentInfo auf, um ein leeres ContentInfo-Objekt zu erstellen.
Rufen Sie IMFASFContentInfo::SetProfile auf, um das Profilobjekt für das ContentInfo-Objekt anzugeben. Informationen zum Erstellen von Profilen finden Sie unter Erstellen eines ASF-Profils.
Rufen Sie IMFASFContentInfo::GenerateHeader auf, übergeben Sie NULL im pIHeader-Parameter , und empfangen Sie die Größe des aufgefüllten ContentInfo-Objekts im pcbHeader-Parameter . Die Anwendung kann diesen Wert verwenden, um Arbeitsspeicher oder den Medienpuffer zuzuweisen, der das Headerobjekt enthält.
Die empfangene Headergröße enthält die Abstandsgröße, die abhängig von der tatsächlichen Größe der Headerobjekte angepasst wird. Die maximale Größe der Headerobjekte beträgt 10 MB. Wenn die Größe diesen Wert überschreitet, schlägt GenerateHeader mit dem MF_E_ASF_INVALIDDATA Fehler fehl.
Rufen Sie MFCreateMemoryBuffer auf, um in Schritt 3 einen Medienpuffer mit der empfangenen Größe zu erstellen.
Rufen Sie GenerateHeader erneut auf, um das neue ASF-Headerobjekt aus dem ContentInfo-Objekt im in Schritt 4 erstellten Medienpuffer zu generieren.
Die Länge der Daten im Medienpuffer wird aktualisiert, und die neue Größe wird im pcbHeader-Parameter zurückgegeben.
Schreiben Sie den Inhalt des Medienpuffers am Anfang der Datei. Die Anwendung kann den Bytedatenstrom verwenden, um den Schreibvorgang auszuführen. Beispielcode finden Sie unter IMFByteStream::Write.
Beispiel
Der folgende Beispielcode zeigt, wie Sie ein ContentInfo-Objekt erstellen und einen Medienpuffer zum Speichern des neuen Headerobjekts generieren. Ein vollständiges Beispiel, das diesen Code verwendet, finden Sie unter Tutorial: Kopieren von ASF-Streams aus einer Datei in eine andere.
//-------------------------------------------------------------------
// 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;
}
Zugehörige Themen