HFFmpeg.cpp
void HFFmpeg::start() {
if(hAudio==NULL)
{
LOGI("audio is NULL");
return;
}
//这儿开启新线程开始写入文件
hAudio->play();
int count=0;
while (hPlayStatus!=NULL&&!hPlayStatus->exit)
{
//如果是在seek的话,就暂停解码操作,我们在seek的时候还需要清空队列,所以就不要再解码了
if(hPlayStatus->seek)
{
continue;
}
/**
* 这个代码很关键
*/
if(hAudio->hQueue->getQueueSize() > 40)
{
continue;
}
AVPacket *avPacket=av_packet_alloc();
pthread_mutex_lock(&seek_mutex);
int ret=av_read_frame(avFormatContext,avPacket);
pthread_mutex_unlock(&seek_mutex);
LOGI("ret的值%d",ret);
//0 if OK
if(ret==0)
{
if(avPacket->stream_index==hAudio->streamIndex)
{
if(LOG_DEBUG)
{
count++;
//LOGI("解码第%d帧",count);
}
hAudio->hQueue->putAvPacket(avPacket);
} else{
av_packet_free(&avPacket);
av_free(avPacket);
}
} else{
if(LOG_DEBUG)
{
LOGI("解码出现错误");
}
av_packet_free(&avPacket);
av_free(avPacket);
//清除队列中的缓存
while (hPlayStatus!=NULL&&!hPlayStatus->exit)
{
if(hAudio->hQueue->getQueueSize()>0)
{
//如果对列中还有数据没有播放完成,就循环等待,并没有清空队列
//所以在下面才可以进行播放完成回调
continue;
} else{
hPlayStatus->exit=true;
break;
}
}
}
}
if(LOG_DEBUG)
{
LOGI("解码完成");
}
//这儿可以回调Java层,通知播放完成
}
image.png
image.png
av_read_frame还在进行的时候ret的值是0,当读到文件末尾的时候返回的是一个负数,注意看日志