none
如何提取WMA中的数据? RRS feed

  • 问题

  • 能查到的资料都是提取标签信息,如何提取音频的采样频率,以及具体的数据?并用这些数据算出每个采样数据的频率,想用代码画频谱图。


    okokwukai

    2012年12月13日 5:41

答案

全部回复

  • 呃,WMA是一个ASF容器而已,里面可以有多个流的。

    你可以枚举每个流然后IWMMediaProps::GetMediaType取流格式。



    Visual C++ MVP

    2012年12月13日 6:34
    版主
  • 谢谢回复到。

    其实我手中的是个wma文件,我读到内存中,只是想分析一下具体的数据,并画出每个采样的频率,我只关心能获得采样频率,并根据这个采样频率,读出数据来,在文件中,能查到data-object的GUID,但后面的数据包是如何组织的,如何解析数据,不得要领。


    okokwukai

    2012年12月13日 6:55
  • 呃,不用重复说一遍的问题啊,API就那么一个,具体怎么用去看Windows Media Format SDK附带的示例就是了。原理在http://msdn.microsoft.com/en-us/library/windows/desktop/dd757594(v=vs.85).aspx


    Visual C++ MVP


    2012年12月13日 7:02
    版主
  • 非常感谢您的回复,这个sdk也是我学习的内容,但问题是,我并不是为了播放去解码,而且是在windows 应用商店项目上应用,那上面好像没找到类似的sdk,如果是播放,那是没问题的。

    我的目标是通过录制wma文件的过程(好像在windows shop app中只支持这一种音频录制)中,画出频谱线,当然后续还有应用。


    okokwukai

    2012年12月13日 7:18
  • Windows Store app里面这个似乎不能用,DirectShow也不行。你录制的话,没有设置采样率这样的参数吗?抓下来PCM的话,你可以自己画频谱啊,不用编码成WMA了再去读出来。你可以把抓下来的音频流传到你的播放器里面去,这个播放器把数据画成频谱而不是播出声音。



    Visual C++ MVP

    2012年12月13日 16:31
    版主
  • 再次感谢你的回复,录制的采样频率是固定的19600,格式也只有wma,要是能录制成pcm,问题就解决了,pcm的数据我是能分析的,但wma真的不太了解,ms的资料基本上都是些sdk,我是需要对具体数据分析的,资料中说,wma是按数据块来分析的,每个块都有个包头,里面是多帧的数据,但我不知道具体的规则,就无从分析了,播放器在sample中给出的就是MediaElement控件,它是无法满足的我需求的。我是想分析出每个采样的音频数据。取得频谱数据是目的。

    MSDN中有没有详细介绍WMA数据块部份的,不是介绍SDK?  如果解决了,明年teched上展示给老师,谢谢了,老朋友。


    okokwukai


    2012年12月14日 1:04
  • MediaElement?不是用MediaCapture录么?你如果要即时显示音量的话只有用WASAPI了,把PCM数据显示完再扔给Windows Media Foundation去编码成WMA。



    Visual C++ MVP

    2012年12月14日 1:25
    版主
  • 是mediacapture录的,我把它保存成byte[]了,因为要使用它做后续处理,但就不是知道data部份是如何组织的。主要是以前很少接触这方面的内容。

    用mediacapture我用的是MediaEncodingProfile.CreateWma(AudioEncodingQuality.Auto做参数 ,用await m_mediaCaptureMgr.StartRecordToStreamAsync(recordProfile, im);去录制,不知道能不能将recordprofile这个参数设置成pcm而不是wma?


    okokwukai

    2012年12月15日 13:20
  • 默认的捕获来源不支持PCM,你一定要用media capture的话要用WASAPI自己写个来源,但是这还不如直接就用WASPI抓PCM……


    Visual C++ MVP

    2012年12月15日 15:18
    版主