FFmpeg开发(六)——Qt视频播放器之封装音频类(参考了暴风影音、迅雷影音)
上一篇介绍了,封装FFmpeg类。
Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)
之前的链接大家可以点击参考:
FFmpeg开发(四)——Qt实现一个视频播放器(参考了暴风影音、迅雷影音)
FFmpeg开发(五)——Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)
FFmpeg开发(六)——Qt视频播放器之封装音频类(参考了暴风影音、迅雷影音)
FFmpeg开发(七)——Qt视频播放器之播放列表类(参考了暴风影音、迅雷影音)
FFmpeg开发(八)——Qt视频播放器之多线程的使用(参考了暴风影音、迅雷影音)
FFmpeg开发(九)——Qt视频播放器之快进滑动条(参考了暴风影音、迅雷影音)
实现的效果如下:
本篇介绍封装音频类。
#include <QObject>
class AudioPlay
{
public:
static AudioPlay *Get();//单例模式
virtual bool Start()=0;//开始
virtual void Play(bool isplay)=0;//是否播放
virtual bool Write(const char *data,int datasize) = 0;//将音频写入
virtual void Stop()=0;//停止
virtual int GetFree() = 0;//获取剩余空间
virtual int setVolume(int iVol) = 0;//
virtual ~AudioPlay();
int sampleRate = 48000;//样本率
int sampleSize = 16;//样本大小
int channel = 2;///通道数
protected:
AudioPlay();
};
#include <QAudioOutput>
#include <QMutex>
class XAudioPlay :public AudioPlay
{
public:
QAudioOutput *output = NULL;
QIODevice *io = NULL;
QMutex mutex;
void Stop()
{
mutex.lock();
if (output)//为打开AudioOutput
{
output->stop();
delete output;
output = NULL;
io = NULL;
}
mutex.unlock();
}
//首先设置播放的格式以及参数
bool Start()
{
Stop();
mutex.lock();
QAudioFormat fmt;//设置音频输出格式
fmt.setSampleRate(48000);//1秒的音频采样率
fmt.setSampleSize(16);//声音样本的大小
fmt.setChannelCount(2);//声道
fmt.setCodec("audio/pcm");//解码格式
fmt.setByteOrder(QAudioFormat::LittleEndian);
fmt.setSampleType(QAudioFormat::UnSignedInt);//设置音频类型
output = new QAudioOutput(fmt);
io = output->start();//播放开始
mutex.unlock();
return true;
}
void Play(bool isplay)
{
mutex.lock();
if (!output)
{
mutex.unlock();
return;
}
if (isplay)
{
output->resume();//恢复播放
}
else
{
output->suspend();//暂停播放
}
mutex.unlock();
}
int GetFree()
{
mutex.lock();
if (!output)
{
mutex.unlock();
return 0;
}
int free = output->bytesFree();//剩余的空间
mutex.unlock();
return free;
}
bool Write(const char *data, int datasize)
{
mutex.lock();
if (io)
io->write(data, datasize);//将获取的音频写入到缓冲区中
mutex.unlock();
return true;
}
int setVolume(int iVol){
output->setVolume(iVol);
}
};
AudioPlay::AudioPlay()
{
}
AudioPlay::~AudioPlay()
{
}
AudioPlay * AudioPlay::Get()
{
static XAudioPlay ap;
return ≈
}
本篇内容参考了网络上的内容。
下一篇介绍播放列表类:
FFmpeg开发(七)——Qt视频播放器之播放列表类(参考了暴风影音、迅雷影音)
本文原创作者:冯一川([email protected]),未经作者授权同意,请勿转载。