2012-09-16 15 views
5

Dziękuję za poświęcenie czasu na przeczytanie mojego pytania.Raw Audio File do AAC przy użyciu Windows Media Foundation na Windows 7

Rozwijam aplikację C++ za pomocą Qt i Windows API.

Nagrywam dane wyjściowe mikrofonu w małych plikach dźwiękowych 10s w formacie nieprzetworzonym i chcę przekonwertować je do formatu aac.

Próbowałem przeczytać tyle rzeczy, ile mogłem, i pomyślałem, że byłoby dobrym pomysłem, aby zacząć od API Windows Media Foundation transkodowania.

Problem polega na tym, że nie mogę użyć pliku .raw lub .pcm w funkcji "CreateObjectFromUrl", więc utknąłem tu na chwilę. Ciągle się nie udaje. Kod powrotu hr wynosi 3222091460. Próbowałem przekazać plik .mp3 do funkcji i oczywiście to działa, więc nie ma w tym przypadku błędu url-człowieka.

MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID; 

IMFSourceResolver* pSourceResolver = NULL; 
IUnknown* pUnkSource = NULL; 

// Create the source resolver. 
hr = MFCreateSourceResolver(&pSourceResolver); 
if (FAILED(hr)) 
{ 
    qDebug() << "Failed !"; 
} 


// Use the source resolver to create the media source. 


hr = pSourceResolver->CreateObjectFromURL(
     sURL,      // URL of the source. 
     MF_RESOLUTION_MEDIASOURCE, // Create a source object. 
     NULL,      // Optional property store. 
     &ObjectType,    // Receives the created object type. 
     &pUnkSource     // Receives a pointer to the media source. 
     ); 

MFCreateSourceResolver działa dobrze, ale CreateObjectFromURL nie uda :(

Mam więc dwa pytania dla ciebie ludzi:

  1. jest to możliwe do zakodowania surowe pliki audio AAC korzystania Windows Media Foundation?
  2. Jeśli tak, co mam przeczytać, aby osiągnąć to, czego chcę?

Chcę zaznaczyć, że nie mogę po prostu użyć ffmpeg lub libav, ponieważ nie stać mnie na licencję na moje oprogramowanie i nie chcę, aby była ona objęta licencją GPL. Ale jeśli istnieją alternatywy dla fundacji Windows Media do kodowania surowych plików audio do aac, byłbym zadowolony słuchając ich.

I na koniec, przykro mi z powodu mojego złego angielskiego, nie jest to oczywiście mój język ojczysty i przepraszam, jeśli sprawiłam, że krwawią ci oczy. (I szczęśliwy, gdybym się śmiejesz)

Miłego dnia

Odpowiedz

3

Kod zwrotny hr równa 3222091460

HRESULT kody. Użyj this "ShowHresult" tool, aby je dla Ciebie wygodnie odszyfrować. Kod oznacza 0xC00D36C4MF_E_UNSUPPORTED_BYTESTREAM_TYPE "Typ strumienia bajtowego podanego adresu URL jest nieobsługiwany."

Problem polega zasadniczo na tym, że nie ma wsparcia dla tych nieprzetworzonych plików. WAV jest dobrym źródłem surowego audio - plik zawiera zarówno deskryptor formatu, jak i ładunek.

Oczywiście można odczytać dane z pliku audio bezpośrednio i skompresować do AAC za pomocą interfejsu AAC Encoder Media Foundation za pośrednictwem interfejsu IMFTransform. Jest to dość łatwe i masz dane AAC na wyjściu do np. napisz na surowe .AAC.

Alternatywą dla Media Foundation jest DirectShow (istnieją odpowiednie kodeki, choć wydawało mi się, że nie jest to takie łatwe do uruchomienia), libfaac, FFmpeg's libavcodec (dostępne na licencji LGPL, a nie na GPL).

+1

Cześć Roman i dziękuję bardzo za odpowiedź. Sprawiło to, że sprawy stały się jasne i nie mogę ci wystarczająco podziękować za twój czas. Pójdę z Encoder AAC z WMF, aby uzyskać surowy AAC i zobaczyć, co mogę zrobić z tego miejsca. Jeśli mogę prosić o 2 inne minuty twojej wiedzy, jako że jestem prawie początkującym w kodowaniu audio ... Nie mogę znaleźć żadnego przykładu kodu, który pomoże mi dowiedzieć się, jakie kroki należy wykonać, aby przekształcić pcm na aac. Jak rozumiem teraz dzięki tobie, muszę utworzyć interfejs IMFTransform, ustawić aac surowego i wyjściowego, ustawić czas trwania próbki i wywołać ProcessOutput. Czy to takie proste? –

+1

Niestety nie mam informacji o dobrym referencyjnym kodzie przykładowym. Jednak kiedyś działałem w przeszłości, więc wiem, że działa dobrze. Tak, to czego potrzebujesz to śledzenie [AAC Encoder] (http://msdn.microsoft.com/library/dd742785%28v=vs.85%29.aspx) i tworzenie instancji klasy MFT, ustawianie typu mediów wejściowych, ustawianie wyjścia typ nośnika (ostrożnie!), a następnie przesyłaj dane PCM za pomocą 'ProcessInput' i ciągnij dane AAC za pomocą' ProcessOutput'. –