6

私の質問を読んでくれてありがとう。

Qt と Windows API を使用して C++ アプリケーションを開発しています。

マイクロフォン出力を小さな 10 秒のオーディオ ファイルに raw 形式で録音していますが、それらを aac 形式に変換したいと考えています。

私はできる限り多くのことを読み込もうとしましたが、Windows Media Foundation トランスコード API から始めるのは素晴らしい考えだと思いました。

問題は、「CreateObjectFromUrl」関数で .raw ファイルまたは .pcm ファイルを使用できないように見えることです。それは失敗し続けます。hr リターン コードは 3222091460 です。関数に .mp3 ファイルを渡そうとしましたが、もちろん機能するので、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.
        );

MFCreateSourceResolver は正常に動作しますが、CreateObjectFromURL は成功しません:(

そこで、皆さんに 2 つの質問があります。

  1. Windows Media Foundation を使用して生のオーディオ ファイルを aac ファイルにエンコードすることは可能ですか?
  2. はいの場合、私が望むことを達成するために何を読むべきですか?

ソフトウェアのライセンスを購入する余裕がないため、ffmpeg や libav だけを使用することはできず、GPL ライセンスの下に置きたくないことを指摘したいと思います。しかし、生のオーディオ ファイルを aac にエンコードするための Windows Media Foundations に代わるものがある場合は、それを聞いて喜んでいます。

そして最後に、私の英語が下手で申し訳ありません。これは明らかに私の母国語ではありません。目が出血してしまったら申し訳ありません。(笑わせてくれたら嬉しい)

良い1日を

4

1 に答える 1

4

hr戻りコードは3222091460に等しい

それらはHRESULTコードです。この「ShowHresult」ツールを使用して、便利にデコードしてもらいます。このコードは0xC00D36C4 MF_E_UNSUPPORTED_BYTESTREAM_TYPE、「指定されたURLのバイトストリームタイプはサポートされていません」という意味です。

問題は基本的に、これらのrawファイルがサポートされていないことです。.WAVはrawオーディオの優れたソースであり、ファイルはフォーマット記述子とペイロードの両方を保持します。

明らかに、生のオーディオファイルからデータを自分で読み取り、MediaFoundationのAACエンコーダーをそのIMFTransformインターフェイス経由で使用してAACに圧縮することができます。これはかなり簡単で、出力にAACデータがあり、たとえばrawに書き込むことができます.AAC

Media Foundationの代替オプションは、DirectShow(開始するのはそれほど簡単ではないと思いましたが、適切なコーデックがあります)libfaac、、 FFmpeg libavcodec(GPLではなくLGPLで利用可能)です。

于 2012-09-16T11:02:00.043 に答える