Aufzählen von Audiotypen für bestimmte Codierungsmodi (Microsoft Media Foundation)
Die vom Audioencoder akzeptierten Eingabe- und Ausgabemedientypen sind sehr strukturiert. Sie müssen unterstützte Ausgabetypen abrufen, indem Sie die IMediaObject::GetOutputType-Methode oder DIETRANSFORM::GetOutputType aufrufen. Nachdem Sie einen Ausgabetyp erhalten haben, dürfen Sie ihn nicht mehr ändern.
Wenn Sie einen anderen Codierungsmodus als 1-Pass-CBR verwenden möchten, müssen Sie den Modus festlegen und dann die Ausgabetypen für diesen Modus aufzählen. Der Encoder ändert die unterstützten Ausgabetypen abhängig vom festgelegten Modus. Die Eigenschaften, die den Codierungsmodus steuern, sind MFPKEY _ VBRENABLED und MFPKEY _ PASSESUSED. Wenn der Modus im Encoder festgelegt ist, müssen Sie einen Ausgabetyp aufzählen und auswählen und ihn ohne Änderung verwenden, genau wie bei CBR.
Identifizieren qualitätsbasierter VBR-Typen
Das Verfahren zum Identifizieren qualitätsbasierter VBR-Typen hängt davon ab, ob der Encoder als DirectX-Medienobjekt (DMO) oder als Media Foundation Transform (MFT) agiert. Informationen dazu, wann ein Encoder als DMO oder MFT fungiert, finden Sie auf den einzelnen Codec-Referenzseiten unter Codec-Objekte.
Wenn ein Audioencoder als DMO und Sie den Encoder für die Verwendung von VBR mit einem Durchgang konfigurieren, werden alle unterstützten Ausgabetypen aufzählt. Sie sollten jedoch in der Regel einen VBR-Typ mit einem Durchgang basierend auf dem Qualitätsparameter auswählen. Der Encoder legt den Qualitätswert für VBR-Ausgabetypen mit einem Durchgang im nAvgBytesPerSec-Member der WAVEFORMATEX-Struktur ab, auf die DMO MEDIA _ _ TYPE.pbFormat verweist.
Dieser Wert wird im folgenden Format gespeichert: 0x7FFFFFXX, wobei XX der Qualitätswert ist (von 0 bis 100). Beispielsweise gibt der nAvgBytesPerSec-Wert 0x7FFFFF62 Qualitätsstufe 98 an (0x62 = 98).
Das folgende Beispiel zeigt, wie sie die Qualitätsstufe eines Formats überprüfen, wenn der Encoder als ein DMO.
void ShowQuality(WAVEFORMATEX* pWave)
{
// Store the average bytes per second in a local variable
// with a more manageable name.
DWORD dwBps = pWave->nAvgBytesPerSec;
// Verify that the value is a VBR quality level by using
// a bitmask to check for the bit pattern 0x7FFFFFXX.
if(dwBps & 0x7FFFFF00 == 0x7FFFFF00)
printf("VBR Quality: %d%%\n",(dwBps & 0x000000FF));
else // Not a valid VBR quality value.
printf("Not a valid one-pass VBR audio format.\n");
}
Wenn der Encoder als MFT agiert und bei einem Aufruf von GetAvailableOutputType einen Ausgabetyp aufzählt, können Sie MFT nach der MFPKEY _ MOST RECENTLY _ _ ENUMERATED _ VBRQUALITY-Eigenschaft abfragen. Der zurückgegebene Wert gibt die VBR-Qualität des zuletzt zurückgegebenen Ausgabemedientyps an. Anschließend können Sie mit diesem Wert die MFPKEY _ DESIRED _ VBRQUALITY-Eigenschaft des Encoders festlegen.
Festlegen von Spitzeneinschränkungen
Für eine qualitätsbasierte VBR (One-Pass) und eine nicht gestützte VBR mit zwei Durchgängen sind nach dem Abrufen des Ausgabetyps keine zusätzlichen Einstellungen erforderlich. Rufen Sie einen Ausgabetyp mit aktivierter VBR und zwei festgelegten Durchläufen ab, um vbr mit Eingeschränkter Spitzenlast zu verwenden. Dieser Typ beschreibt ohne Änderung die nicht trainierten VBR-Einstellungen. Legen Sie zum Festlegen von Spitzeneinschränkungen die Eigenschaften MFPKEY _ RMAX und MFPKEY _ BMAX fest.