SDL播放音频逻辑

音视频文章汇总
本文介绍SDL播放解码pcm数据逻辑。

SDL通过回调的方式开启子线程播放音频
逻辑如下:


图片.png
   //SDL缓冲区找解码器拉取符合播放格式的音频PCM流
   //清零(静音处理)
    SDL_memset(stream,0,len);
   //len:SDL音频缓冲区剩余的大小(音频缓冲区还未填充的大小)
    while (len > 0) {
        //说明当前PCM的数据已经全部拷贝到SDL音频缓冲区了
        //需要解码下一个pkt,获取新的PCM数据
        if(_aSwrOutIdx >= _aSwrOutSize){
            //全新PCM数据的大小
            _aSwrOutSize = decodeAudio();
            //索引清零
            _aSwrOutIdx = 0;
//            qDebug() << “解码一次的数据大小�" << _aSwrOutSize;
            //没有解码出PCM数据,那就静音处理
            if(_aSwrOutSize <= 0){
               //出错了,或者还没有解码出PCM数据,假定1024个字节静音处理
                //假定1024个字节
                _aSwrOutSize = 1024;
                //给PCM填充0(静音)
                memset(_aSwrOutFrame->data[0],0,_aSwrOutSize);
            }
        }
        //本次需要填充到stream中的数据大小
        int fillLen = _aSwrOutSize - _aSwrOutIdx;
        fillLen = std::min(fillLen,len);
        //获取音量
        int volumn = _mute ? 0:(_volumn * 1.0/Max) * SDL_MIX_MAXVOLUME;
        //将一个pkt包解码后的pcm数据填充到SDL的音频缓冲区
        SDL_MixAudio(stream,_aSwrOutFrame->data[0]+_aSwrOutIdx,fillLen,volumn);
        //移动偏移量�
        len -= fillLen;//SDL缓冲区剩余的大小
        stream += fillLen;//stream的位置向后移动
        _aSwrOutIdx += fillLen;//_aSwrOutIdx在_aSwrOutFrame->data[0]中的位置向后移动
    }

你可能感兴趣的:(SDL播放音频逻辑)