美文网首页
FFmpeg 播放时间计算

FFmpeg 播放时间计算

作者: 王一一一一 | 来源:发表于2019-07-16 20:22 被阅读0次

    概念

    AVFormatContext *pAVFormatCtx;//整个媒体流的处理流程中都会用到的对象,媒体文件或媒体流的构成和基本信息
    
    1、计算总时长:

    通过 pAVFormatCtx->duration 即可得到总时长,但是再 FFmpeg 中 duration 是以AV_TIME_BASE为单位,所以转换为秒的计算为:

        duration = pAVFormatCtx->duration / AV_TIME_BASE;
    

    其中AV_TIME_BASE是FFmpeg 中的内部计时单位(时间基),FFmpeg 中的所有时间都是于它为一个单位,内部定义为

    /**
     * Internal time base represented as integer
     */
    #define AV_TIME_BASE            1000000
    

    可见FFmpeg 内部时间单位为微秒 (μs), 即AV_TIME_BASE 单位是1us。

    2、根据PTS求出一帧在视频中对应的秒数位置:

    根据PTS(显示时间戳)来计算一帧在整个视频或音频中的时间位置,PTS的时间单位为AVRational,即AV_TIME_BASE的倒数,av_q2d()是FFmpeg 提供把AVRatioal结构转换成double的函数。av_q2d(time_base)=每个刻度是多少秒。

    AVRational time_base = = pAVFormatCtx->streams[i]->time_base;
    now_time = frame->pts * av_q2d(time_base);
    

    AVRational 这个结构标识一个分数,结构定义:

    /**
     * Rational number (pair of numerator and denominator).
     */
    typedef struct AVRational{
        int num; //分数
        int den; //分母
    } AVRational;
    

    实际上time_base的意思就是时间的刻度:
    如(1,25),那么时间刻度就是1/25
    如(1,9000),那么时间刻度就是1/90000

    pts的值就是占多少个时间刻度(占多少个格子)。它的单位不是秒,而是时间刻度。只有pts加上time_base两者同时在一起,才能表达出时间是多少。

    3、计算当前播放时间:

    假设某通道的音频信号是采样率为8kHz,位宽为16bit,20ms一帧,双通道,则一帧音频数据的大小为:
    int size = 8000 x 16bit x 0.02s x 2 = 5120 bit = 640 byte

    公式:时间 = PCM实际数据大小 / 每秒理论PCM大小;

      clock += buffersize / ((double)(sample_rate * 2 * 2));
    

    相关文章

      网友评论

          本文标题:FFmpeg 播放时间计算

          本文链接:https://www.haomeiwen.com/subject/inlxlctx.html