c++获取系统pcm_音频播放封装(pcm格式,Windows平台 c++)

这篇博客介绍了如何在Windows平台上使用C++封装Waveform Audio Functions来播放PCM格式的音频。作者创建了一个CPcmPlay类,实现了打开、设置音量、播放、停止和关闭音频设备等功能,并详细阐述了异步播放的实现机制,包括回调函数和缓冲区管理。
摘要由CSDN通过智能技术生成

介绍 pcm格式是音频非压缩格式。如果要对音频文件播放,需要先转换为pcm格式。

windows提供了多套函数用于播放,本文介绍Waveform Audio Functions系列函数。

原始的播放函数比较难用,因工作需要,我写了一个播放器,将播放相关函数封装了;非常好用,还不易出错。

播放流程

程序头文件可以根据头文件窥探函数功能,下面再做简单介绍。

classCPcmPlay

{public:

CPcmPlay();~CPcmPlay();//是否打开了 播放设备

BOOL IsOpen();//nSamplesPerSec 采样频率 8000//采样位数 :8,16//声道个数: 1

BOOL Open(int nSamplesPerSec, int wBitsPerSample, intnChannels);//设置声音大小 0到100

BOOL SetVolume(intvolume);//播放内存数据//异步播放,block指针数据可以立即删除

MMRESULT Play(LPSTR block, DWORD size);void StopPlay(); //停止播放

BOOL IsOnPlay(); //是否有数据在播放

void Close();//关闭播放设备

double GetCurPlaySpan(); //获取当前块已播放的时长

double GetLeftPlaySpan(); //获取剩余播放播放的时长

BOOL IsNoPlayBuffer();//打开音频还没播放过

private:voidOnOpen();voidOnClose();void OnDone(WAVEHDR *header);void AddHeader(WAVEHDR *header);void DelHeader(WAVEHDR *header);//根据数据长度,计算播放长度 单位秒

double GetPlayTimeSpan(intbufferLen);void staticCALLBACK MyWaveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance,

DWORD_PTR dwParam1, DWORD_PTR dwParam2);private:

UINT64 m_totalPlayBuffer;

WAVEFORMATEX m_waveForm;

HWAVEOUT m_hWaveOut;

std::listm_listWaveOutHead;

CCritical m_listLock;

};

1)打开音频设备

BOOL CPcmPlay::Open(int nSamplesPerSec,int wBitsPerSample,intnChannels)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现基于Qt/C的音频转换程序可以使用Qt的多媒体框架和音频处理库。具体步骤如下: 1. 首先,选择Qt的多媒体框架,以便处理音频文件。可以在Qt Creator中创建一个基于Qt的桌面应用程序项目。 2. 在Qt的项目中引入Qt Multimedia库,该库提供了对音频的处理功能。可以通过在.pro文件中添加`QT += multimedia`来引入该库。 3. 在Qt的项目中创建一个界面,用于用户选择待转换的音频文件和转换参数。可以使用Qt的UI设计器来创建用户界面,例如添加文件选择按钮和转换按钮。 4. 当用户点击转换按钮时,程序将执行音频转换的操作。在转换操作中,首先需要读取待转换的音频文件。 5. 若要实现PCM到WAV的转换,需要将PCM音频数据封装为WAV文件格式。使用Qt的QAudioFormat类来设置WAV格式音频参数,例如采样率、位深度等。 6. 创建一个QFile对象并打开一个.wave文件,在文件中写入WAV文件头部信息。 7. 读取PCM音频数据,并根据WAV的音频参数将数据写入.wave文件。 8. 如果需要实现WAV到PCM的转换,可以使用Qt的QAudioDecoder类来解码WAV文件,提取出PCM数据。 9. 在PCM互转WAV和位数转换的情况下,可以使用Qt的QAudioConverter类来实现。 10. 最后,将转换后的音频文件保存到指定位置。 以上就是基于Qt/C的音频转换程序的实现步骤。通过以上方法,可以轻松地实现PCM和WAV文件的互相转换和位数的转换。 ### 回答2: 基于QT/C的音频转换程序可以实现PCM格式音频文件与WAV格式音频文件的互相转换和位数转换。 PCM(脉冲编码调制)是一种无压缩的音频编码格式,它将模拟音频信号数字化,采样率和位深度可以自定义。WAV是一种开放的音频文件格式,常用于存储无压缩的音频数据。PCM转换为WAV格式可以使音频文件能够在各种播放器和设备中播放。 首先,程序需要读取PCM格式音频文件,并解析其采样率、位深度等参数。这些参数将在转换过程中用于重构WAV文件头。 接下来,程序根据WAV格式的规范,创建一个新的WAV文件,并将PCM音频数据写入。同时,需要根据PCM音频数据的位深度,进行相应的位数转换。例如,将16位的PCM音频数据转换为8位的WAV音频数据。 转换完成后,程序会保存新生成的WAV文件,该文件可以被各种音频播放器或设备直接播放。 同样地,该音频转换程序也可以将WAV格式音频文件转换为PCM格式。程序会读取WAV文件的文件头信息,并解析其中的采样率、位深度等参数。然后,程序将WAV文件中的音频数据进行位数转换,并写入一个新的PCM文件。 通过该基于QT/C的音频转换程序,我们可以方便地将PCM格式音频文件与WAV格式音频文件进行互相转换,同时实现位数转换。这样,我们就可以根据实际需求,对音频文件进行灵活的处理和使用。 ### 回答3: 基于Qt/C的音频转换程序可以实现PCM到WAV的互转,以及位数转换。PCM是一种原始的音频格式,而WAV是一种常用的音频文件格式PCM到WAV的转换可以通过读取PCM文件的原始数据,然后添加WAV文件头部信息的方式实现。WAV文件头部包含了音频的采样率、位数、通道数等信息。程序可以根据用户选择的参数生成WAV文件头部,并将PCM数据和WAV头部写入新的WAV文件。 位数转换可以将16位的PCM数据转换为8位的PCM数据,或者将8位的PCM数据转换为16位的PCM数据。转换过程中,将每个采样数据的位数进行缩放或扩展即可。程序可以根据用户选择的目标位数对PCM数据进行相应的位数转换,并将转换后的数据写入新的PCM文件或WAV文件。 在实现这个音频转换程序时,可以使用Qt的音频相关类库,如QAudioFormat和QAudioOutput来处理音频数据的读取和写入,以及音频文件格式的解析和生成。同时,还可以利用Qt提供的界面框架来设计一个简洁易用的用户界面,让用户可以方便地选择要转换的文件和转换参数。 总的来说,基于Qt/C的音频转换程序可以实现PCM到WAV的互转和位数转换功能,通过读取和处理音频数据,生成相应的音频文件。该程序可以提供一个用户友好的界面,让用户可以方便地操作和选择转换参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值