2016-07-07 35 views
2

Ich möchte Windows Media Foundation verwenden, um die Audiodaten einer AAC-codierten Datei abzurufen. Ich fand heraus, dass der richtige Weg ist, ein IMFSample * zu deklarieren, in dem das einzelne Sample des Audiomaterials gespeichert wird. In VS2015 sehe ich, dass diese Klasse eine Methode getDouble() hat, aber es gibt nichts darüber in der MSDN documentation.Windows Media Foundation: Erhalten von dekodierten AAC-Daten

Hier ist der Teil von Beispiel ich zu tun versucht:

IMFSample *pSample(NULL); 

    hr = m_pReader->ReadSample(
     MF_SOURCE_READER_FIRST_AUDIO_STREAM, // [in] DWORD dwStreamIndex, 
     0,         // [in] DWORD dwControlFlags, 
     NULL,        // [out] DWORD *pdwActualStreamIndex, 
     &dwFlags,       // [out] DWORD *pdwStreamFlags, 
     &timestamp,       // [out] LONGLONG *pllTimestamp, 
     &pSample);       // [out] IMFSample **ppSample 

Das letzte Argument PSAMPLE ist das, was ich will.

Nun möchte ich Doppel, Float oder Byte-Zeiger auf die aktuellen decodierten Beispieldaten erhalten.

Wie kann das gemacht werden?

Vielen Dank im Voraus.

Antwort

2

zuerst die Probe in einen Puffer konvertieren:

Microsoft::WRL::ComPtr<IMFMediaBuffer> mediaBuffer; 
sample->ConvertToContiguousBuffer(&mediaBuffer) 

dann den Puffer sperren einen Zeiger auf seine Interna zu erhalten:

BYTE *audioData = nullptr; 
DWORD sampleBufferLength = 0; 
mediaBuffer->Lock(&audioData, nullptr, &sampleBufferLength); 
// use audioData... 
mediaBuffer->Unlock(); 

Um festzulegen, was das Format der Daten an Sie zurückgeschickt wird verwenden SetCurrentMediaType auf Ihrem Leser (tun dies einmal am Anfang)

Microsoft::WRL::ComPtr<IMFMediaType> pPartialType; 
    MFCreateMediaType(&pPartialType); 
    pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); 
    pPartialType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float); 
    reader->SetCurrentMediaType(
     (DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, 
     NULL, pPartialType.Get()); 

Und pl Verwenden Sie einfach intelligente Zeiger überall mit MF oder Sie werden eine Welt der Schmerzen betreten. Microsoft::WRL::ComPtr<XXX> ist dein Freund! Ich habe es versäumt, die HRESULTs in diesem Beispielcode zu überprüfen, aber Sie werden das definitiv tun wollen.

+0

Danke für die Antwort Mike. Ich habe eine andere Frage. Die Daten, die wir daraus erhalten, sind die nicht dekodierten Rechte? – mbaros

+1

@mbaros Dies sind die dekodierten Daten - eine Liste von Fließkommazahlen [im Bereich 0 bis 1.0], die die Rohproben repräsentieren. –