0

私はこれに困惑しています。誰かが私を正しい方向に向けてくれることを本当に望んでいます。

現在、Windows Mobile でビデオをキャプチャし、WMV 9 DMO (CLSID_CWMV9EncMediaObject) を使用してエンコードしています。これで十分に機能しますが、出力ビデオのビットレートが高すぎるため、ビデオ ファイルが大きすぎて私のニーズには対応できません。

最終的に、私の目標は、Microsoft のカメラ キャプチャ ダイアログが C++ コードから「メッセージング」品質モード (64kbps) で出力するビデオ設定を模倣することです。 現在、私のコードは 352kbps のビットレートで WMV ファイルを出力しています。

WMV9 DMO でキャプチャ ビットレートを指定する唯一の例は、これでした。そのコードのアイデアは、基本的にプロパティバッグを使用してビットレートを DMO のプロパティに書き込むことでした。

更新: Windows モバイルでは、ビットレートに相当すると思われる最も近いコーデック プロパティは "g_wszWMVCVBRQuality" です。このプロパティに関するMicrosoft のドキュメントは、私にとって非常に紛らわしいものです。基本的には、数値が高いほど品質が高くなると言っているようですが、各数値の詳細についてはまったく説明されていません。WMV9 DMO のプロパティバッグを介してこのプロパティを「1」などの値に設定しようとすると、-2147467259 (不明) エラーが発生します。

要約すると、Windows モバイル プラットフォームで directshow (wmv9) を介してキャプチャされたビデオのビットレート/品質を指定するための基本的な戦略は何ですか? 次の方法を聞いた(または疑問に思った):

  1. プロパティバッグを使用して、ビットレート/品質に対応するエンコーダ DMO のプロパティを変更します (現在失敗しています)。
  2. 独自のカスタム トランスコーダ/エンコーダを作成して指定します。WMV エンコーダーは十分に機能するため、これは必要ないように思われます。ビットレートが高すぎるだけです。
  3. VIDEOINFOHEADER にはビットレート プロパティがありますが、ここで新しい設定を指定しても、実際のエンコード プロセスを変更することにはならないのではないかと思います。これは、エンコード後までファイル属性が有効になるとは思わないからです。

助言がありますか?

PS: 特定のソース コードを投稿したいと思いますが、この時点では、これを行う方法について非常に苦労しているため、役立つ以上に混乱する可能性があります。現時点では、一般的な戦略を検証しようとしています。

ありがとう!

4

1 に答える 1

1

さて、propertybagの値を設定するときにエラーを回避しました(方法1)。これで、ビデオの「品質」を問題なくプログラムで設定できるようになりました。

私は順不同で物事をやっていた。WMV9 DMOエンコーダーをグラフに追加した、 renderstreamを呼び出す前に 行うと、説明した(およびリンクされた)方法で設定を正常に変更できます。VARIANTとともにpropertybagを使用して、DMOのg_wszWMVCVBRQualityプロパティに変更を加えます(ここでも、CLSID_DMOWrapperFilterを使用しています)。Windows Mobileの場合、そのグローバルはWindows Mobile6SDKのwmcodecstrs.hファイルで定義されます。

基本的に、設定する数値が小さいほど、品質は低下します。MSのドキュメントが言ったように; )
たとえば、1に設定すると、絶対にひどいビデオが生成されます。

ちなみに、私のdshowコードビデオとCCDで生成されたビデオのサイズの違いは、ビデオフィードのビットレートではなく、ビデオファイルに組み込まれていたオーディオストリームによるものでした。VLC Media Playerによると、CCDのビデオは8000hzで8ビットオーディオでしたが、私のコードのビデオは22050hzで16ビットオーディオでした。サイズ差が大きい!今、私はオーディオ設定を下げる方法を理解する必要があります... > :(

于 2010-02-09T23:05:17.793 に答える