FFmpeg: 一個簡單測試手機解碼效率的方法


先寫一個獲取當前時間戳的方法

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%

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM