Windows-Mobile Directshow:指定WMV视频捕获的比特率/质量

时间:2010-02-08 22:09:17

标签: windows-mobile video directshow capture bitrate

我很难过,我真的希望有人能指出我正确的方向。

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

最终,我的目标是模仿Microsoft的 Camera Capture Dialog 在我的C ++代码中以“消息”质量模式(64kbps)输出的视频设置。目前,我的代码输出比特率为352kbps的WMV文件。

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

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

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

  1. 使用propertybag更改与比特率/质量相对应的编码器DMO属性(当前失败)
  2. 创建您自己的自定义转码器/编码器以指定它。这似乎是不必要的,因为WMV编码器工作得很好 - 它的比特率太高了。
  3. VIDEOINFOHEADER具有比特率属性,但我怀疑在此处指定新设置对改变实际编码过程无效,因为我不认为文件属性会在编码之后发挥作用。
  4. 有什么建议吗?

    PS: 我会发布具体的源代码,但是在这一点上它可能会让人感到困惑,因为我在如何做到这一点上挣扎得太多了。在这一点上,我只是想验证一般策略。

    谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我在设置propertybag值时遇到了错误(方法1),现在我可以通过编程方式设置视频“质量”而不会发生任何事故。

我正在做的事情不按顺序。如果你在添加WMV9 DMO之后,我可以按照我描述的方式(并链接到)成功更改设置编码器到图形但调用renderstream之前。使用propertybag和VARIANT对DMO进行更改(同样,我使用的是CLSID_DMOWrapperFilter)g_wszWMVCVBRQuality属性。对于Windows Mobile,该全局是在Windows Mobile 6 SDK的 wmcodecstrs.h 文件中定义的。

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

另一方面,我的dshow代码视频和CCD生成的视频之间的大小差异不是由于视频输入的比特率,而是因为被检测到的视频文件的音频流。根据VLC媒体播放器,CCD的视频是8000hz的8位音频,而我的代码的视频在22050hz时有16位音频。大尺寸差异!现在我只想弄清楚如何降低音频设置... > :(