先寫一個獲取當前時間戳的方法
long long GetNowMs() { struct timeval tv; gettimeofday(&tv, NULL); int sec = tv.tv_sec % 360000; // 為了簡化計算,否則最后用於計算的ms會很大 long long t = sec * 1000 + tv.tv_usec / 1000; return t; }
然后在每次讀取一幀數據之前和解碼器解碼完成之后添加下列代碼
讀取一幀數據之前:
if (GetNowMs() - start_time >= 3000) { LOGI("now decoder fps is %d", frameCount / 3); start_time = GetNowMs(); frameCount = 0; } int re = av_read_frame(ic, pkt); // 讀取一幀數據 ......
解碼器解碼完一幀數據之后,對已解碼的幀數進行累加:
for (;;) { re = avcodec_receive_frame(cc, frame); if (re != 0) { LOGE("avcodec_receive_frame() failed"); break; } if (cc == vc) { frameCount++; } }
通過已解碼的幀數除以中間間隔的時長就可以得到每秒解碼的幀數。
手頭有兩部手機,實際測試結果如下:
三星S6電信版
FFmpeg軟解(單線程): fps = 25-30幀, 耗費CPU:12%
FFmpeg軟解(8線程):fps = 100-120幀,耗費CPU:57-66%
FFmpeg硬解(8線程):fps = 190-200幀, 耗費CPU:8%
谷歌Nexus6p
FFmpeg軟解(單線程): fps = 30-45幀(不穩定), 耗費CPU:12%
FFmpeg軟解(8線程):fps = 90-100幀,耗費CPU:75-80%
FFmpeg硬解(8線程):fps = 55幀, 耗費CPU:4%