FFmpeg开发(六)——Qt视频播放器之封装音频类(参考了暴风影音、迅雷影音)

17 篇文章 4 订阅
11 篇文章 17 订阅

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 &ap;
}

本篇内容参考了网络上的内容。

下一篇介绍播放列表类:

FFmpeg开发(七)——Qt视频播放器之播放列表类(参考了暴风影音、迅雷影音)

本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯一川

谢谢老板对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值