我很难过,我真的希望有人能指出我正确的方向。
我目前正在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)指定要捕获的视频的比特率/质量的基本策略是什么? 我听说过(或想知道)以下方法:
有什么建议吗?
PS: 我会发布具体的源代码,但是在这一点上它可能会让人感到困惑,因为我在如何做到这一点上挣扎得太多了。在这一点上,我只是想验证一般策略。
谢谢!
答案 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位音频。大尺寸差异!现在我只想弄清楚如何降低音频设置... > :(