2012-09-16 9 views
5

Danke, dass Sie sich etwas Zeit genommen haben, um meine Frage zu lesen.Raw-Audiodatei an AAC mit Windows Media Foundation unter Windows 7

Ich entwickle eine C++ - Anwendung mit Qt und Windows-API.

Ich nehme die Mikrofonausgabe in kleinen 10s Audiodateien im Rohformat auf, und ich möchte sie in aac Format konvertieren.

Ich habe versucht, so viele Dinge wie möglich zu lesen, und dachte, es wäre eine gute Idee, von Windows Media Foundation Transcode-API zu starten.

Problem ist, ich kann nicht scheinen, eine .raw oder .pcm-Datei in der Funktion "CreateObjectFromUrl" zu verwenden, und so bin ich ziemlich fest hier für den Moment. Es scheitert immer weiter. Der hr Returncode ist gleich 3222091460. Ich habe versucht, eine .mp3-Datei an die Funktion zu übergeben und natürlich funktioniert das auch, also kein url-human-failure.

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. 
     ); 

Die MFCreateSourceResolver funktioniert gut, aber CreateObjectFromURL nicht gelingt :(

Also ich habe zwei Fragen an Sie Leute:

  1. Ist es möglich, rohe Audio-Dateien in AAC-Dateien zu kodieren, unter Verwendung von Windows Media Foundation?
  2. Wenn ja, was soll ich lesen, um zu erreichen, was ich will?

Ich möchte darauf hinweisen, dass ich nicht einfach ffmpeg oder libav verwenden kann, weil ich mir keine Lizenz für meine Software leisten kann und nicht unter der GPL-Lizenz stehen soll. Aber wenn es Alternativen zu Windows Media Foundations gibt, um rohe Audiodateien zu aac zu kodieren, würde ich mich freuen, sie zu hören.

Und schließlich, Entschuldigung für mein schlechtes Englisch, das ist offensichtlich nicht meine Muttersprache und es tut mir leid, wenn ich Ihre Augen bluten ließ. (Und glücklich, wenn ich dich lachen)

Haben Sie einen schönen Tag

Antwort

3

Der hr Return-Code entspricht 3222091460

Das sind HRESULT Codes. Verwenden Sie this "ShowHresult" tool, um sie bequem für Sie zu dekodieren. Der Code bedeutet 0xC00D36C4MF_E_UNSUPPORTED_BYTESTREAM_TYPE "Der Byte-Stream-Typ der angegebenen URL wird nicht unterstützt."

Das Problem ist im Grunde, dass es keine Unterstützung für diese Raw-Dateien gibt, .WAV ist eine gute Quelle für Roh-Audio - die Datei enthält sowohl Formatdeskriptor und die Nutzlast.

Sie können natürlich Daten aus der RAW-Audiodatei selbst lesen und in AAC mit Media Foundation AAC Encoder über seine IMFTransform Schnittstelle komprimieren. Dies ist ziemlich einfach und Sie haben AAC-Daten über die Ausgabe z. schreibe in rohe .AAC.

Alternative Optionen zu Media Foundation ist DirectShow (es gibt geeignete Codecs, obwohl ich dachte, es könnte nicht so einfach zu starten), libfaac, FFmpeg libavcodec (verfügbar unter LGPL, nicht GPL).

+1

Hallo Roman und vielen Dank für Ihre Antwort. Es hat die Dinge sehr deutlich gemacht, und ich kann dir nicht genug für deine Zeit danken. Ich werde mit dem AAC Encoder von WMF gehen, um rohe AAC zu bekommen und zu sehen, was ich von dort machen kann. Wenn ich Sie zwei weitere Minuten Ihres Wissens fragen kann, da ich ein Anfänger in der Audiocodierung bin ... Ich kann kein Code-Beispiel finden, um mir zu helfen, auf welchen Schritten ich PCM zu konvertieren sollte aac. Wie ich es jetzt dank Ihnen verstehe, muss ich eine IMFTransform-Schnittstelle erstellen, Eingabe roh und Ausgabe aac, Probe Dauer festlegen und ProcessOutput aufrufen. Ist das so einfach? –

+1

Leider kenne ich keinen guten Referenzcode. Wie auch immer, ich habe es irgendwann in der Vergangenheit laufen lassen, also weiß ich, dass es gut funktioniert. Ja, was Sie im Grunde brauchen, ist [AAC Encoder] zu folgen (http://msdn.microsoft.com/library/dd742785%28v=vs.85%29.aspx) und instanziieren Sie die MFT-Klasse, legen Sie den Eingabe-Medientyp fest, setzen Sie die Ausgabe Medientyp (vorsichtig!), drücken Sie dann PCM-Daten mit 'ProcessInput' und ziehen Sie AAC-Daten mit' ProcessOutput'. –