zoukankan      html  css  js  c++  java
  • MCI处理2G以上wav文件会有问题

    这个问题在我测试查询大于2G的wav文件长度时遇到的,后来在google讨论组进行了讨论,初步可以确定这是MCI库函数中的BUG,在处理2G以上wav文件会出现,其他情况未验证。

    bug情况:mciSendCommand函数查询文件长度或查询正在播放的位置会返回错误的结果。

    bug重现代码:

        MCI_SET_PARMS mciSetParms;

        mciSetParms.dwTimeFormat = MCI_FORMAT_SAMPLES;

        if(m_ErrorCode = mciSendCommand(m_wDeviceID,MCI_SET,MCI_WAIT|MCI_SET_TIME_FORMAT,

            (DWORD_PTR) &mciSetParms))

        {

            return false;

        }

        MCI_STATUS_PARMS mciStatusParms;

        mciStatusParms.dwItem = MCI_STATUS_LENGTH;

        DWORD flags = MCI_STATUS_ITEM|MCI_WAIT ;

         if(m_ErrorCode = mciSendCommand(m_wDeviceID, MCI_STATUS,flags,

            (DWORD_PTR)&mciStatusParms))

        {

            return false;

        }

    测试2.29G大小的wav文件,查询wav文件采样数总数,mciStatusParms.dwReturn正确的返回值应该是1231253424(这个数字可以通过wav头文件信息计算得到),而代码中实际返回值为3378737072. mciStatusParms的内存布局如下:

    cc cc cc cc b0 6f 63 c9 01 00 00 00  cc cc cc cc

    小端机器,红色部分就是错误的返回值。可以看到错误返回值和正确数值仅仅是最高位不同。因此很有可能是API函数内部处理不当导致的。

    同样的情况还会在使用MCI_STATUS_POSITION参数来查询正在播放的位置时出现。返回的位置信息有误。

    另外,参考google讨论组中某位的意见,用xp自带的MPLAYER.EXE程序进行测试,因为据说它是完全用MCI实现的。测试结果是,用MPLAYER.EXE打开大于2G的wav文件时,时间轴信息无效,且时间长度无法显示。由此可以更加确定MCI的API在处理2G以上wav文件时有BUG。

    希望能尽快得到修复。

    del.icio.us: C++, MCI, 多媒体编程
    Flickr: C++, MCI, 多媒体编程
  • 相关阅读:
    WP7备注(13)(独立储存)
    WP7备注(14)(ContentPropertyAttribute)
    WP7备注(11)(页面跳转)
    WP7备注(10)(Accelerometer+GeoCoordinateWatcher+Map Service)
    WP7备注(12)(页面数据共享)
    WP7备注(18)(OpacityMask)
    WP7备注(15)(Resources)
    WP7备注(19)(ImageBrush|VideoBrush)
    WP7备注(17)(TextBlock和Inlines)
    vmware 复制其他电脑的linux无法上网问题
  • 原文地址:https://www.cnblogs.com/absolute8511/p/1653385.html
Copyright © 2011-2022 走看看