本文共 1861 字,大约阅读时间需要 6 分钟。
QAudioFormat:音频格式
(1)setSampleRate:设置样本率/采样率。 (2)setSampleSize:设置样本大小(位数),设置一个采样点用多少bit来表示。 (3)setChannelCount:设置通道数量。 (4)setCodec:设置编码器,目前仅仅支持:setCodec(“audio/pcm”)。 (5)setByteOrder(QAudioFormat::LittleEndian):设置是字节序,使用默认的小端格式,低位在低字节,高位在高字节。 (6)setSampleType:设置采样类型,setSampleType(QAudioFormat::UnSignedInt)。QAudioOutput:播放设置
(1)QIODevice* start():用于获取音频输出设备的引用。 (2)suspend():暂停播放。 (3)resume():恢复播放。 (4)bufferSize():用来做缓存/缓冲的空间的大小。音频播放和视频播放不同,视频播放中间少几十毫秒的数据基本不会有太大的问题;但音频播放少了几十毫秒的数据,就会明显的听出卡顿的感觉,所以音频播放需要做缓存,将很多的音频数据直接先缓存起来,播放时,直接播放缓存里面的数据即可。 (5)bytesFree():用来判断缓冲/缓存里面有没有空余空间。往缓存里面写数据之前,需要先判断缓存是否有足够的空间来存放当前需要存放的数据。 (6)periodSize():指内部硬件一次播放多大的数据,声卡不会一次性就把缓存里面的数据都读完了。QIODevice:
代码示例: ```cpp qint64 write(const char *data, qint64 len) ```通过ffmpeg解码出来的音频,将重采样之后的数据写给QT,QT就会播放。其返回值是真正写进去的大小。代码:
#include "widget.h" #include#include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QAudioFormat fmt; fmt.setSampleRate(44100); fmt.setSampleSize(16); fmt.setChannelCount(2); fmt.setCodec("audio/pcm"); fmt.setByteOrder(QAudioFormat::LittleEndian); fmt.setSampleType(QAudioFormat::UnSignedInt); QAudioOutput *out = new QAudioOutput(fmt); QIODevice *io = out->start(); int size = out->periodSize(); char *buf = new char[size]; FILE *fp = fopen("debug/out.pcm", "rb"); while (!feof(fp)) { if (out->bytesFree() < size) { QThread::msleep(1); continue; } int len = fread(buf, 1, size, fp); if (len <= 0) break; io->write(buf, len); } fclose(fp); delete buf; buf = 0; Widget w; w.show(); return a.exec(); }
转载地址:http://kkisz.baihongyu.com/