Freigeben über


Nicht komprimierte Audiomedientypen

Um einen vollständigen unkomprimierten Audiotyp zu erstellen, legen Sie mindestens die folgenden Attribute auf dem IMFMediaType-Schnittstellenzeiger fest.

attribute BESCHREIBUNG
MF_MT_MAJOR_TYPE Haupttyp. Legen Sie auf MFMediaType_Audio fest.
MF_MT_SUBTYPE Untertyp. Weitere Informationen finden Sie unter Audiountertyp-GUIDs.
MF_MT_AUDIO_NUM_CHANNELS Anzahl der Audiokanäle.
MF_MT_AUDIO_SAMPLES_PER_SECOND Anzahl der Audiobeispiele pro Sekunde.
MF_MT_AUDIO_BLOCK_ALIGNMENT Blockausrichtung.
MF_MT_AUDIO_AVG_BYTES_PER_SECOND Durchschnittliche Anzahl von Bytes pro Sekunde.
MF_MT_AUDIO_BITS_PER_SAMPLE Anzahl der Bits pro Audiobeispiel.
MF_MT_ALL_SAMPLES_INDEPENDENT Gibt an, ob jedes Audiobeispiel unabhängig ist. Legen Sie für MFAudioFormat_PCM- und MFAudioFormat_Float-Formate auf TRUE fest.

 

Darüber hinaus sind die folgenden Attribute für einige Audioformate erforderlich.

attribute BESCHREIBUNG
MF_MT_AUDIO_VALID_BITS_PER_SAMPLE Anzahl der gültigen Bits von Audiodaten in jedem Audiobeispiel. Legen Sie dieses Attribut fest, wenn die Audiobeispiele eine Auffüllung aufweisen, d. h. wenn die Anzahl der gültigen Bits in jedem Audiobeispiel kleiner als die Samplegröße ist.
MF_MT_AUDIO_CHANNEL_MASK Die Zuweisung von Audiokanälen zu Sprecherpositionen. Legen Sie dieses Attribut für mehrkanalige Audiostreams fest, z. B. 5.1. Dieses Attribut ist für Mono- oder Stereoaudio nicht erforderlich.

 

Beispielcode

Der folgende Code zeigt, wie Sie einen Medientyp für nicht komprimierte PCM-Audiodaten erstellen.

HRESULT CreatePCMAudioType(
    UINT32 sampleRate,        // Samples per second
    UINT32 bitsPerSample,     // Bits per sample
    UINT32 cChannels,         // Number of channels
    IMFMediaType **ppType     // Receives a pointer to the media type.
    )
{
    HRESULT hr = S_OK;

    IMFMediaType *pType = NULL;

    // Calculate derived values.
    UINT32 blockAlign = cChannels * (bitsPerSample / 8);
    UINT32 bytesPerSecond = blockAlign * sampleRate;

    // Create the empty media type.
    hr = MFCreateMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set attributes on the type.
    hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, cChannels);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, sampleRate);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, blockAlign);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, bytesPerSecond);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, bitsPerSample);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the type to the caller.
    *ppType = pType;
    (*ppType)->AddRef();

done:
    SafeRelease(&pType);
    return hr;
}

Im nächsten Beispiel wird ein codiertes Audioformat als Eingabe verwendet und ein entsprechender PCM-Audiotyp erstellt. Dieser Typ eignet sich beispielsweise für die Einstellung für einen Encoder oder Decoder.

//-------------------------------------------------------------------
// ConvertAudioTypeToPCM
//
// Given an audio media type (which might describe a compressed audio
// format), returns a media type that describes the equivalent
// uncompressed PCM format.
//-------------------------------------------------------------------

HRESULT ConvertAudioTypeToPCM(
    IMFMediaType *pType,        // Pointer to an encoded audio type.
    IMFMediaType **ppType       // Receives a matching PCM audio type.
    )
{
    HRESULT hr = S_OK;

    GUID majortype = { 0 };
    GUID subtype = { 0 };

    UINT32 cChannels = 0;
    UINT32 samplesPerSec = 0;
    UINT32 bitsPerSample = 0;

    hr = pType->GetMajorType(&majortype);
    if (FAILED(hr)) 
    { 
        return hr;
    }

    if (majortype != MFMediaType_Audio)
    {
        return MF_E_INVALIDMEDIATYPE;
    }

    // Get the audio subtype.
    hr = pType->GetGUID(MF_MT_SUBTYPE, &subtype);
    if (FAILED(hr)) 
    { 
        return hr;
    }

    if (subtype == MFAudioFormat_PCM)
    {
        // This is already a PCM audio type. Return the same pointer.

        *ppType = pType;
        (*ppType)->AddRef();

        return S_OK;
    }

    // Get the sample rate and other information from the audio format.

    cChannels = MFGetAttributeUINT32(pType, MF_MT_AUDIO_NUM_CHANNELS, 0);
    samplesPerSec = MFGetAttributeUINT32(pType, MF_MT_AUDIO_SAMPLES_PER_SECOND, 0);
    bitsPerSample = MFGetAttributeUINT32(pType, MF_MT_AUDIO_BITS_PER_SAMPLE, 16);

    // Note: Some encoded audio formats do not contain a value for bits/sample.
    // In that case, use a default value of 16. Most codecs will accept this value.

    if (cChannels == 0 || samplesPerSec == 0)
    {
        return MF_E_INVALIDTYPE;
    }

    // Create the corresponding PCM audio type.
    hr = CreatePCMAudioType(samplesPerSec, bitsPerSample, cChannels, ppType);

    return hr;
}

Audiomedientypen