第十一節 關於播放完成的回撥
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層,通知播放完成
}
av_read_frame還在進行的時候ret的值是0,當讀到檔案末尾的時候返回的是一個負數,注意看日誌
相關文章
- 關於 PayPal 支付回撥的問題
- 關於 js 中的回撥函式 callbackJS函式
- 關於js回撥方法及遞迴時的使用JS遞迴
- [iOS] [OC] 關於block回撥、高階函式“回撥再呼叫”及專案實踐iOSBloC函式
- 整理一下關於jq佇列和回撥佇列
- 關於Yii2 微信支付回撥地址處理
- Activity生命週期回撥是如何被回撥的?
- [JS]回撥函式和回撥地獄JS函式
- 回撥方法
- 回撥函式的作用函式
- 基於python + opencv的影片播放調節功能PythonOpenCV
- C++回撥C++
- js 回撥 callbackJS
- 回撥函式函式
- 回撥地獄
- 非同步/回撥非同步
- java回撥函式-非同步回撥-簡明講解Java函式非同步
- C++屌屌的觀察者模式-同步回撥和非同步回撥C++模式非同步
- 回撥和spring的LambdaSafe類Spring
- Android 回撥方法的實現Android
- 回撥函式的理解(一)函式
- Bean 的生命週期回撥Bean
- 對於Unity回撥、監聽與廣播的使用總結Unity
- 初學 PHP 對於回撥函式的一些理解PHP函式
- 回撥函式(CallBack)函式
- 微博回撥介面
- JavaScript回撥函式JavaScript函式
- JavaScript 回撥函式JavaScript函式
- JS—回撥函式JS函式
- 【詳細、開箱即用】.NET企業微信回撥配置(資料回撥URL和指令回撥URL驗證)
- C++中的回撥函式C++函式
- sort回撥的簡單模擬
- ntp導致的時鐘回撥
- ajax中回撥的幾個坑
- 《Node.js設計模式》基於回撥的非同步控制流Node.js設計模式非同步
- 關於成都 Gopher Meetup 的回顧Go
- 基於Guava API實現非同步通知和事件回撥GuavaAPI非同步事件
- 函式回撥(C++)函式C++