第八节 暂停、加载、播放、计算播放时长

image.png
void HAudio::pause() {

    if(pcmPlayerPlay!=NULL)
    {
        (*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay,SL_PLAYSTATE_PAUSED);
    }


}

void HAudio::resume() {

    if(pcmPlayerPlay!=NULL)
    {
        (*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay,SL_PLAYSTATE_PLAYING);
    }

}
需要注意的是,暂停之后OpenSL ES的播放回调函数也会暂停

计算播放时长

image.png

代码:
HFFmpeg.cpp

 //查找音频流的索引
    for(int i=0;inb_streams;i++)
    {
        if(avFormatContext->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_AUDIO)
        {
            if(hAudio==NULL)
            {
                hAudio=new HAudio(hPlayStatus,avFormatContext->streams[i]->codecpar->sample_rate,callBackJava);
                hAudio->streamIndex=i;
                hAudio->avCodecParameters=avFormatContext->streams[i]->codecpar;
                //统计播放时间使用
                hAudio->duration=avFormatContext->duration/AV_TIME_BASE;
                hAudio->time_base=avFormatContext->streams[i]->time_base;
            }

        }
    }

初始化解码器的时候记录下duration、time_base

 //当前AVFrame中存放的时间(比如说该Frame出现在2分钟的时候,那么它的值就是2分钟)
            now_time=avFrame->pts*av_q2d(time_base);
            //clock表示的是从开始播放到现在已经播放的时长
            if(now_time

在进行重采样的时候记录下当前帧的时间,并做校验

void pcmBufferCallBack(SLAndroidSimpleBufferQueueItf bf, void * context)
{
    HAudio *wlAudio = (HAudio *) context;
    if(wlAudio != NULL)
    {
        LOGI("循环调用重采样");
        int buffersize = wlAudio->resampleAudio();
        if(buffersize > 0)
        {
            wlAudio->clock+=buffersize/(double)(wlAudio->sample_rate*2*2);
            //我们0.1s回调一次
            if(wlAudio->clock-wlAudio->last_time>0.1)
            {
                wlAudio->last_time=wlAudio->clock;
                //回调Java层显示时间
                wlAudio->callBackJava->onShowTime(CHILD_THREAD,wlAudio->duration,wlAudio->clock);

            }
            (* wlAudio-> pcmBufferQueue)->Enqueue( wlAudio->pcmBufferQueue, (char *) wlAudio-> buffer, buffersize);
        }
    }
}

在OpenSL ES的播放回调函数中,回调Java层代码

看一些日志:


image.png
image.png

判断加载中

在重采样方法中

if(queue->getQueueSize() == 0)//加载中
        {
            if(!playstatus->load)
            {
                playstatus->load = true;
                callJava->onCallLoad(CHILD_THREAD, true);
            }
            continue;
        } else{
            if(playstatus->load)
            {
                playstatus->load = false;
                callJava->onCallLoad(CHILD_THREAD, false);
            }
        }

你可能感兴趣的:(第八节 暂停、加载、播放、计算播放时长)