10.QT-QAudioOutput類使用

本章須要用到的類以下:html

  • QAudioDeviceInfo類提供音頻輸出設備
  • QAudioFormat類提供音頻參數設置
  • QAudioOutput類提供了用於將PCM原始音頻數據發送到音頻輸出設備的接口。
 
1.QAudioDeviceInfo類
用來提供音頻輸出設備,而且包含該設備支持的格式,排序,通道,編碼器,頻率,採樣率等, 用戶能夠經過 bool isFormatSupported(const QAudioFormat &settings) 來判斷是否支持該格式.用戶通常經過 defaultOutputDevice()來獲取當前默認播放設備.
若是想獲取全部音頻輸出設備能夠經過availableDevices()成員函數,好比:
foreach(const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput))
{
     qDebug() << "Device name: " << deviceInfo.deviceName();
}    

2.QAudioOutput類數組

經常使用函數以下所示:
QAudio::Error QAudioOutput::error(); //獲取當前錯誤信息
void QAudioOutput::suspend(); //暫停
void QAudioOutput::resume(); //恢復
void QAudioOutput::start(QIODevice *device) //啓動播放,參數是QIODevice(須要經過write成員寫入pcm數據數組)
QIODevice *QAudioOutput::start(); //打開設備並返回一個指向內部QIODevice的指針,經過write()即可以直接向其寫入pcm數據進行播放. QAudio::State QAudioOutput::state(); //獲取當前QAudioOutput狀態,狀態以下所示: //QAudio::ActiveState:正在播放中 //QAudio::SuspendedState:正在暫停中 //QAudio::StoppedState:已被中止,多是被異常終止了 //QAudio::IdleState:處於空閒中,什麼都沒幹

void QAudioOutput::setVolume(qreal volume); //設置音量 (0.0~1.0之間,默認音量爲1.0)
void QAudioOutput::setBufferSize(int value); //從新設置緩衝區大小,須要在start()以前設置
int QAudioOutput::bufferSize() const//獲取緩衝區大小,默認爲35280,須要start()後,才分配buff
int QAudioOutput::bytesFree() //返回音頻緩衝區中可用的空閒字節數。 //注意:返回值僅在QAudio::ActiveState或QAudio::IdleState狀態下有效,不然返回零。

int QAudioOutput::periodSize(); //週期大小(以字節爲單位),每播放一次音頻數據所需多少個數據量
                    //periodSize用來防止緩衝區欠運行和確保不間斷回放所需的數據量

 

3.初始化QAudioOutput
開始播放音頻流只需使用QIODevice調用start()便可。而後QAudioOutput將從io設備中獲取所需的數據。因此播放音頻文件是簡單的以下:
QFile sourceFile;  
QAudioOutput* audio; 
sourceFile.setFileName("/tmp/test.raw");
sourceFile.open(QIODevice::ReadOnly);
 
QAudioFormat format;
// Set up the format, eg.
format.setSampleRate(44100); //設置採樣率
format.setChannelCount(1); //設置通道數
format.setSampleSize(16); //樣本數據16位
format.setCodec("audio/pcm"); //播出格式爲pcm格式
format.setByteOrder(QAudioFormat::LittleEndian); //默認小端模式
format.setSampleType(QAudioFormat::UnSignedInt); //無符號整形數
 
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); //選擇默認輸出設備
 
if (!info.isFormatSupported(format))
{
qDebug()<<"輸出設備不支持該格式,不能播放音頻";
return;
}
 
audio = new QAudioOutput(format, this);
connect(audio, SIGNAL(stateChanged(QAudio::State)),this,SLOT(handleStateChanged(QAudio::State)));
 
audio->start(&sourceFile);
}

文件在播放過程當中, 當遇到錯誤時,狀態更改成QAudio::StoppedState,併發送stateChanged()信號函數,這時能夠經過error()函數獲取錯誤信息,注意:文件播放結束(QAudio::IdleState)後,須要中止設備:併發

void AudioOutputExample::handleStateChanged(QAudio::State newState)
{
    switch (newState) {
        case QAudio::IdleState:
            // 數據已經沒有了,播放完畢
            audio->stop();
            sourceFile.close();
            delete audio;
            break;
         
        case QAudio::StoppedState:
                // 音頻設備已關閉,檢查error是否異常關閉
                if (audio->error() != QAudio::NoError) {
                // Error handling
                }
                break;
         
        case QAudio::SuspendedState:
            // 音頻被暫停
            break;
            
            
        case QAudio::ActiveState:
            // 啓動音頻播放,正在解析中
            break;
    }
}

4.補充說明函數

因爲QAudioOutput支持的輸入數據必須是原始數據,因此播放mp3,WAV,AAC等格式文件,須要解封裝後才能支持播放.post

而在QT中,提供了QMediaPlayer類能夠支持解封裝,可是該類的解碼協議都是基於平臺的,若是平臺自身沒法播放,那麼QMediaPlayer也沒法播放.有興趣的朋友能夠去試試.學習

因此接下來,咱們使用ffmpeg+QAudioOutput來實現一個簡單的音頻播放器ui

 

未完待續,下章學習:11.QT-ffmpeg+QAudioOutput實現音頻播放器this

相關文章
相關標籤/搜索