0

我对此感到困惑,我真的希望有人能指出我正确的方向。

我目前正在 Windows Mobile 中捕获视频并使用 WMV 9 DMO (CLSID_CWMV9EncMediaObject) 对其进行编码。这一切都很好,但输出视频的比特率太高,导致视频文件太大而无法满足我的需求。

最终,我的目标是从我的 C++ 代码中模仿 Microsoft 的相机捕捉对话框以“消息”质量模式 (64kbps) 输出的视频设置。 目前,我的代码正在输出比特率为 352kbps 的 WMV 文件。

我能找到的使用 WMV9 DMO 指定捕获比特率的唯一示例是这个。该代码中的想法基本上是使用属性包将比特率写入 DMO 的属性。

更新: 在 Windows Mobile 中,我能找到的最接近比特率的编解码器属性是“g_wszWMVCVBRQuality”。微软关于这个属性的文档让我非常困惑:它基本上似乎说更高的数字等同于更高的质量,但它绝对没有解释每个数字的细节。当我尝试通过 WMV9 DMO 的属性包将此属性设置为类似“1”的值时,我遇到了 -2147467259(未知)错误。

总结一下:在 windows 移动平台上指定通过 directshow (wmv9) 捕获的视频的比特率/质量的基本策略是什么? 我听说过(或想知道)以下方法:

  1. 使用属性包更改编码器 DMO 对应比特率/质量的属性(当前失败)
  2. 创建您自己的自定义转码器/编码器来指定它。这似乎没有必要,因为 WMV 编码器工作得很好——它的比特率太高了。
  3. VIDEOINFOHEADER 有一个比特率属性,但我怀疑在这里指定新设置不会改变实际的编码过程,因为我认为文件属性在编码之后才会发挥作用。

有什么建议么?

PS:我会发布特定的源代码,但在这一点上,它可能会造成混淆,而不是帮助,因为我在如何做到这一点上苦苦挣扎。在这一点上,我只是想验证一般策略。

谢谢!

4

1 回答 1

1

好的,我在设置 propertybag 值(方法 1)时解决了这个错误,我现在可以以编程方式设置视频“质量”而不会发生意外。

我做事不正常。 如果您将 WMV9 DMO 编码器添加到图形之后但调用 renderstream. 使用属性包和 VARIANT 对 DMO 的(同样,我使用 CLSID_DMOWrapperFilter)g_wszWMVCVBRQuality 属性进行更改。对于 Windows Mobile,该全局定义在 Windows Mobile 6 SDK 的wmcodecstrs.h文件中。

基本上,您设置的数字越低,质量越差。就像 MS 文档说的那样;)
例如,将其设置为 1 会产生看起来非常糟糕的视频。

附带说明一下,我的 dshow 代码视频和 CCD 生成的视频之间的大小差异不是由于视频源的比特率,而是由于正在插入视频文件的音频流。根据 VLC 媒体播放器,CCD 的视频是 8000hz 的 8 位音频,而我的代码的视频是 22050hz 的 16 位音频。大小差别大!现在我只需要弄清楚如何降低音频设置... >:(

于 2010-02-09T23:05:17.793 回答