音視頻文章匯總
本文介紹SDL播放解碼pcm數(shù)據(jù)邏輯翔怎。
SDL通過(guò)回調(diào)的方式開(kāi)啟子線(xiàn)程播放音頻
邏輯如下:
圖片.png
//SDL緩沖區(qū)找解碼器拉取符合播放格式的音頻PCM流
//清零(靜音處理)
SDL_memset(stream,0,len);
//len:SDL音頻緩沖區(qū)剩余的大小(音頻緩沖區(qū)還未填充的大小)
while (len > 0) {
//說(shuō)明當(dāng)前PCM的數(shù)據(jù)已經(jīng)全部拷貝到SDL音頻緩沖區(qū)了
//需要解碼下一個(gè)pkt,獲取新的PCM數(shù)據(jù)
if(_aSwrOutIdx >= _aSwrOutSize){
//全新PCM數(shù)據(jù)的大小
_aSwrOutSize = decodeAudio();
//索引清零
_aSwrOutIdx = 0;
// qDebug() << “解碼一次的數(shù)據(jù)大小?" << _aSwrOutSize;
//沒(méi)有解碼出PCM數(shù)據(jù),那就靜音處理
if(_aSwrOutSize <= 0){
//出錯(cuò)了乐纸,或者還沒(méi)有解碼出PCM數(shù)據(jù),假定1024個(gè)字節(jié)靜音處理
//假定1024個(gè)字節(jié)
_aSwrOutSize = 1024;
//給PCM填充0(靜音)
memset(_aSwrOutFrame->data[0],0,_aSwrOutSize);
}
}
//本次需要填充到stream中的數(shù)據(jù)大小
int fillLen = _aSwrOutSize - _aSwrOutIdx;
fillLen = std::min(fillLen,len);
//獲取音量
int volumn = _mute ? 0:(_volumn * 1.0/Max) * SDL_MIX_MAXVOLUME;
//將一個(gè)pkt包解碼后的pcm數(shù)據(jù)填充到SDL的音頻緩沖區(qū)
SDL_MixAudio(stream,_aSwrOutFrame->data[0]+_aSwrOutIdx,fillLen,volumn);
//移動(dòng)偏移量?
len -= fillLen;//SDL緩沖區(qū)剩余的大小
stream += fillLen;//stream的位置向后移動(dòng)
_aSwrOutIdx += fillLen;//_aSwrOutIdx在_aSwrOutFrame->data[0]中的位置向后移動(dòng)
}