首页 > 其他分享 >使用opensl 的BufferQueueAudioPlayer对wav文件的播放

使用opensl 的BufferQueueAudioPlayer对wav文件的播放

时间:2022-12-26 11:11:44浏览次数:46  
标签:BufferQueueAudioPlayer SAMPLINGRATE SPEAKER SL FRONT wav opensl SLuint32 define

创建音频引擎之后,读取wav文件到内存,然后使用BufferQueueAudioPlayer进行播放。

这里在读取wav文件的时候需要对wav文件的前44个类似头信息进行解析,然后在进行播放的时候,在创建BufferQueueAudioPlayer的时候需要配置音源的时候需要用到,要不然是不能正常播放wav文件的。

复制代码
 SLDataFormat_PCM format_pcm = {
     SL_DATAFORMAT_PCM,                    //数据格式定义
     1, 
     SL_SAMPLINGRATE_8,                    //采样率(hz)
        SL_PCMSAMPLEFORMAT_FIXED_16,    //采样格式
        SL_PCMSAMPLEFORMAT_FIXED_16,    //
        SL_SPEAKER_FRONT_CENTER,        //声道相关
        SL_BYTEORDER_LITTLEENDIAN        //块的字节顺序 从16--32位
 };
复制代码

其中数据格式定义可选:

#define SL_DATAFORMAT_MIME        ((SLuint32) 0x00000001)
#define SL_DATAFORMAT_PCM        ((SLuint32) 0x00000002)
#define SL_DATAFORMAT_RESERVED3    ((SLuint32) 0x00000003)
#define SL_DATAFORMAT_PCM_EX    ((SLuint32) 0x00000004)

这里重点是采样率,如果设置的采用率与读取的wav文件内的采用率不同的话,声音是不能正常播放的,下面是sl提供的采用率:

复制代码
#define SL_SAMPLINGRATE_8          ((SLuint32) 8000000)
#define SL_SAMPLINGRATE_11_025     ((SLuint32) 11025000)
#define SL_SAMPLINGRATE_12         ((SLuint32) 12000000)
#define SL_SAMPLINGRATE_16         ((SLuint32) 16000000)
#define SL_SAMPLINGRATE_22_05      ((SLuint32) 22050000)
#define SL_SAMPLINGRATE_24         ((SLuint32) 24000000)
#define SL_SAMPLINGRATE_32         ((SLuint32) 32000000)
#define SL_SAMPLINGRATE_44_1       ((SLuint32) 44100000)
#define SL_SAMPLINGRATE_48         ((SLuint32) 48000000)
#define SL_SAMPLINGRATE_64         ((SLuint32) 64000000)
#define SL_SAMPLINGRATE_88_2       ((SLuint32) 88200000)
#define SL_SAMPLINGRATE_96         ((SLuint32) 96000000)
#define SL_SAMPLINGRATE_192        ((SLuint32) 192000000)
复制代码

虽然sl支持的采样率很多,但通常用到的也就是 8000000 和 44100000 这两个。

第四个参数是采样格式,sl列举下面几个:

复制代码
#define SL_PCMSAMPLEFORMAT_FIXED_8     ((SLuint16) 0x0008)
#define SL_PCMSAMPLEFORMAT_FIXED_16    ((SLuint16) 0x0010)
#define SL_PCMSAMPLEFORMAT_FIXED_20    ((SLuint16) 0x0014)
#define SL_PCMSAMPLEFORMAT_FIXED_24    ((SLuint16) 0x0018)
#define SL_PCMSAMPLEFORMAT_FIXED_28    ((SLuint16) 0x001C)
#define SL_PCMSAMPLEFORMAT_FIXED_32    ((SLuint16) 0x0020)
#define SL_PCMSAMPLEFORMAT_FIXED_64    ((SLuint16) 0x0040)
复制代码

第五个参数同上。

第六个参数,应该属于声道相关的,研究的很浅,sl给列举的也不少:

复制代码
#define SL_SPEAKER_FRONT_LEFT                  ((SLuint32) 0x00000001)
#define SL_SPEAKER_FRONT_RIGHT                 ((SLuint32) 0x00000002)
#define SL_SPEAKER_FRONT_CENTER                ((SLuint32) 0x00000004)
#define SL_SPEAKER_LOW_FREQUENCY               ((SLuint32) 0x00000008)
#define SL_SPEAKER_BACK_LEFT                   ((SLuint32) 0x00000010)
#define SL_SPEAKER_BACK_RIGHT                  ((SLuint32) 0x00000020)
#define SL_SPEAKER_FRONT_LEFT_OF_CENTER        ((SLuint32) 0x00000040)
#define SL_SPEAKER_FRONT_RIGHT_OF_CENTER       ((SLuint32) 0x00000080)
#define SL_SPEAKER_BACK_CENTER                 ((SLuint32) 0x00000100)
#define SL_SPEAKER_SIDE_LEFT                   ((SLuint32) 0x00000200)
#define SL_SPEAKER_SIDE_RIGHT                  ((SLuint32) 0x00000400)
#define SL_SPEAKER_TOP_CENTER                  ((SLuint32) 0x00000800)
#define SL_SPEAKER_TOP_FRONT_LEFT              ((SLuint32) 0x00001000)
#define SL_SPEAKER_TOP_FRONT_CENTER            ((SLuint32) 0x00002000)
#define SL_SPEAKER_TOP_FRONT_RIGHT             ((SLuint32) 0x00004000)
#define SL_SPEAKER_TOP_BACK_LEFT               ((SLuint32) 0x00008000)
#define SL_SPEAKER_TOP_BACK_CENTER             ((SLuint32) 0x00010000)
#define SL_SPEAKER_TOP_BACK_RIGHT              ((SLuint32) 0x00020000)
复制代码

第七个参数:

#define SL_BYTEORDER_BIGENDIAN                ((SLuint32) 0x00000001)
#define SL_BYTEORDER_LITTLEENDIAN            ((SLuint32) 0x00000002)

音源配置成功后设置播放状态,使用内存进行播放。

sl提供的接口是

SLresult (*Enqueue) (
SLBufferQueueItf self,  //创建的BufferQueueAudioPlayer
const void *pBuffer,    //读取wave文件的buffer  
SLuint32 size,      //buffer大小
SLboolean isLastBuffer  //是否最后(暂时没用过)
);

实际用法:

SLresult result;
        result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
        if (SL_RESULT_SUCCESS != result) {
            return JNI_FALSE;
        }

在使用BufferQueueAudioPlayer进行播放的时候,我试图去频繁的获取播放的状态

SLresult (*GetPlayState) (
SLPlayItf self,
SLuint32 *pState
);

 

的时候,貌似获取的都是playing 而在一个wav文件播放结束的时候,还是没有出现我所期待的stopped,暂时还不知道什么原因。

标签:BufferQueueAudioPlayer,SAMPLINGRATE,SPEAKER,SL,FRONT,wav,opensl,SLuint32,define
From: https://www.cnblogs.com/kn-zheng/p/17005272.html

相关文章

  • wav to pcm 和 pcm to wav
    wav2pcmimportnumpyasnpdefwav2pcm(wav_file,pcm_file,data_type=np.int16):f=open(wav_file,"rb")f.seek(0)f.read(44)data=np.fromf......
  • [water wave] Ray theory-5
    thedepthslowlyvaryforwaterwaveP100-1Show:\[\theta_x^2+\theta_y^2=c_0\tag{1}\]hasasolutioninthisform:\[\theta=f(x+\lambday)\]method-1Wec......
  • WAVE绘制频谱图(一)——WAVE文件基础
    {https://blog.csdn.net/qq_36568418/article/details/91517965?spm=1001.2014.3001.5502}{最近有个项目涉及到PCM数据绘制频谱图,因为WAVE文件中音频为PCM,所以就拿读取......
  • WAVE绘制频谱图(二)——WAVE文件解析提取PCM数据
    {https://blog.csdn.net/qq_36568418/article/details/91530563?spm=1001.2014.3001.5502}{为了不太多依赖于平台环境,音频数据提取部分尽量都用c++实现。话不多说,直接......
  • 非侵入式负荷监测因果神经网络新秀——WaveNILM​(转载)
    WaveNILM:ACausalNeuralNetworkforPowerDisaggregation​CausalitydeservesmoreattentioninDeepLearning​PhotobyAlessandroBianchionUnsplash​Introdu......
  • [water wave] Ray theory-4
    thedepthslowlyvaryforwaterwavelet'scontinue\[\frac{\partial(\omega)}{\partialk}=\frac{\partial}{\partialk}\left[\frac{\sigma}{\delta^2}\tanh[\si......
  • [water wave] Ray theory-3
    thedepthslowlyvaryforwaterwavep96-1show\[\beta_0=A_0\cosh[\sigma(z-B)]\]Wehave:(notethat\(\omega\rightarrow\)omega)\[\beta_{0zz}-\sigma^......
  • [water wave] Ray theory-2
    thedepthslowlyvaryforwaterwavep94-1show:\[\phi_z=a\delta^2\left(\phi_xB_{\bar{x}}+\phi_yB_{\bar{y}}\right)\text{on}z=B(\bar{x},\bar{y})\]S......
  • 二进制文件转Hex和Wav文件转Hex的Java代码
    二进制文件转Hex对于需要将二进制数据写入固件的场景(例如mp3文件),需要将二进制文件表示为byte数组importjava.io.File;importjava.io.FileInputStream;importjav......
  • [water wave] Ray theory-1
    thedepthslowlyvaryforwaterwavewaterwavepage93show:\[\begin{align}&\phi_{zz}+\delta^2\left(\phi_{xx}+\phi_{yy}\right)=0,\\&\phi_z=\delta^2......