zoukankan      html  css  js  c++  java
  • 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%

  • 相关阅读:
    MYSQL常用命令集合(转载)
    Spring(七)持久层
    Spring(六)AOP切入方式
    面试题目
    11 集合
    10 常用类
    9 异常机制
    8 面向对象之抽象类+接口+内部类
    7 面向对象的三大特征
    6 面向对象之类和对象
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/10690792.html
Copyright © 2011-2022 走看看