![](https://img.haomeiwen.com/i2607504/cc38a31108dba500.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的播放回调函数也会暂停
计算播放时长
![](https://img.haomeiwen.com/i2607504/3249a6710b6bb9d4.png)
代码:
HFFmpeg.cpp
//查找音频流的索引
for(int i=0;i<avFormatContext->nb_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<clock)
{
now_time=clock;
}
clock=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层代码
看一些日志:
![](https://img.haomeiwen.com/i2607504/46b9c4a4941fbe81.png)
![](https://img.haomeiwen.com/i2607504/ff6bc16e00723d76.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);
}
}
网友评论