第十一節 關於播放完成的回撥

weixin_33936401發表於2018-12-06

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層,通知播放完成


}
2607504-4f7ee4c4b8f5259f.png
image.png
2607504-3d56d588b774ca1d.png
image.png

av_read_frame還在進行的時候ret的值是0,當讀到檔案末尾的時候返回的是一個負數,注意看日誌

相關文章