2012-09-16 17 views
5

Grazie per aver dedicato del tempo a leggere la mia domanda.File audio non elaborato su AAC utilizzando Windows Media Foundation su Windows 7

Sto sviluppando un'applicazione C++ utilizzando Qt e Windows API.

Sto registrando l'uscita del microfono in piccoli file audio 10s in formato raw e voglio convertirli in formato AAC.

Ho provato a leggere il maggior numero possibile di cose e ho pensato che sarebbe stata una buona idea iniziare dall'API transcode di Windows Media Foundation.

Il problema è che non riesco a utilizzare un file .raw o .pcm nella funzione "CreateObjectFromUrl" e quindi per il momento sono praticamente bloccato. Continua a non riuscire. Il codice di ritorno hr è uguale a 3222091460. Ho provato a passare un file .mp3 alla funzione e, ovviamente, funziona, quindi non sono coinvolti 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. 
     ); 

Il MFCreateSourceResolver funziona bene, ma CreateObjectFromURL non riuscire :(

Così ho due domande per voi ragazzi:

  1. è possibile codificare i file audio prime file AAC usando windows media foundation?
  2. Se sì, cosa devo leggere per ottenere ciò che voglio?

Voglio sottolineare che non posso usare ffmpeg o libav perché non posso permettermi alcuna licenza per il mio software e non voglio che sia sotto la licenza GPL. Ma se ci sono alternative alle basi multimediali di Windows per codificare i file audio grezzi su aac, sarei lieto di ascoltarli.

E infine, scusa per il mio pessimo inglese, questa ovviamente non è la mia lingua madre e mi dispiace se ho fatto sanguinare gli occhi. (E felice se ti ho fatto ridere)

have a nice day

risposta

3

Il codice di ritorno uguale a hr 3222091460

Quelli sono HRESULT codici. Utilizza this "ShowHresult" tool per decodificarli comodamente per te. Il codice significa 0xC00D36C4MF_E_UNSUPPORTED_BYTESTREAM_TYPE "Il tipo di flusso di byte dell'URL specificato non è supportato."

Il problema è fondamentalmente che non esiste alcun supporto per questi file raw. WAV è una buona fonte per l'audio non elaborato: il file contiene sia il descrittore di formato che il payload.

È ovviamente possibile leggere i dati dal file audio raw e comprimerli in AAC utilizzando lo standard AAC Encoder di Media Foundation tramite l'interfaccia IMFTransform. Questo è ragionevolmente facile e si dispone di dati AAC sull'output ad es. scrivere in raw .AAC.

opzioni alternative a Media Foundation è DirectShow (ci sono i codec adatti, anche se ho pensato che potrebbe essere non così facile da avviare), libfaac, di FFmpeg libavcodec (disponibile sotto licenza LGPL, non GPL).

+1

Ciao Roman e grazie mille per la risposta. Ha reso le cose molto chiare e non posso ringraziarti abbastanza per il tuo tempo. Vado con l'encoder AAC da WMF per ottenere raw AAC e vedere cosa posso fare da lì. Se posso chiederti altri 2 minuti di conoscenza, dato che sono praticamente un principiante nella codifica audio ... Non riesco a trovare alcun esempio di codice per aiutarmi a capire quali passi devo seguire per trasformare pcm in aac. Come ho capito ora grazie a te, ho bisogno di creare un'interfaccia IMFTransform, impostare input raw e output aac, impostare la durata del campione e chiamare ProcessOutput. È così semplice? –

+1

Purtroppo non sono a conoscenza del buon codice di esempio di riferimento. Tuttavia, in passato avevo lavorato qualche volta, quindi so che funziona bene. Sì, ciò di cui hai fondamentalmente bisogno è seguire [AAC Encoder] (http://msdn.microsoft.com/library/dd742785%28v=vs.85%29.aspx) e creare un'istanza della classe MFT, impostare il tipo di media di input, impostare l'output tipo di supporto (attentamente!), quindi premere i dati PCM con 'ProcessInput' e tirare i dati AAC con' ProcessOutput'. –