美文网首页
ffmpeg 时间戳、时间基准

ffmpeg 时间戳、时间基准

作者: adaodao3056 | 来源:发表于2020-09-23 09:17 被阅读0次

av_q2d(AVRational a)函数

av_q2d(AVRational);该函数负责把AVRational结构转换成double,通过这个函数可以计算出某一帧在视频中的时间位置
timestamp(秒) = pts * av_q2d(st->time_base);
计算视频长度的方法:
time(秒) = st->duration * av_q2d(st->time_base);

av_rescale_q(int64_t a, AVRational bq, AVRational cq)函数

这个函数的作用是计算a*bq / cq来把时间戳从一个时间基调整到另外一个时间基。在进行时间基转换的时候,应该首先这个函数,因为它可以避免溢出的情况发生

ffmpeg内部的时间与标准的时间转换方法:

timestamp(ffmpeg内部的时间戳) = AV_TIME_BASE * time(秒)
time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部的时间戳)

ts格式文件中3600间隔是什么意思?

它是25fps帧率的ts媒体文件,每个视频帧的间隔时间。
ts文件的封装时基是90kHz为单位,timebase是AVRational{1,90000},简单的理解就是把1秒分成了90000等分,拿25帧率ts文件来分析
按标准时间来计算每帧的间隔:
公式为:1 / 25 = 0.04(秒) = 40毫秒
按ffmpeg中的1秒(即90000)来计算每帧的间隔(单位好像没有明确的定义,暂且使用ffmpeg吧):
90000 / 25 = 3600(ffmpeg)
用时间转换公式可能会更清楚一些:
1(s) = 90000(ffmpeg)
40(ms) = 3600(ffmpeg)

不同的时间基

现实中不同的封装格式,timebase是不一样的。另外,整个转码过程,不同的数据状态对应的时间基也不一致。还是拿mpegts封装格式25fps来
说(只说视频,音频大致一样,但也略有不同)。非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVRational{1,25}。
压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVRational{1,90000}

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfiltergraph.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/time.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int i = 0;
    av_register_all();
    int64_t start = av_gettime_relative();
    AVRational tb = (AVRational){1,90000};
    for(i=1; i < 100; i++)
    {
    #if 1
        usleep(1000*40);//等待40毫秒
        int64_t time = av_gettime_relative();//单位:AV_TIME_BASE,即ffmpeg内部使用的时间单位 
        int64_t timestamp = time - start;
    #else
        int64_t timestamp = i*0.04 * AV_TIME_BASE;//把实际的时间单位转换成AV_TIME_BASE
    #endif

相关文章

  • ffmpeg 时间戳、时间基准

    av_q2d(AVRational a)函数 av_rescale_q(int64_t a, AVRational...

  • ffmpeg -- 时间基准

    AV_TIME_BASE ffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,AV...

  • ffmpeg添加动态时间戳的问题

    最近项目有个需求——给录制的视频按照基准时间添加动态时间戳。 看到这个需求,第一个想到的就是用ffmpeg去转换,...

  • FFmpeg概念名词

    时间戳 FFmpeg里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentati...

  • ffmpeg中的时间戳与时间基

    前言 在开发多媒体播放器或直播系统时,音视频的同步是非常关键且复杂的点。要想把音视频同步搞明白,我们必须要了解一些...

  • FFmpeg中的时间戳与时间基

    最近在学习FFmpeg的过程中发现,其他的知识点还比较清楚,就是对于FFmpeg中的时间基概念模糊,前面做Demo...

  • FFmpeg中的时间戳与时间基

    简介 在开发多媒体播放器或直播系统时,音视频的同步是非常关键且复杂的点。要想把音视频同步搞明白,我们必须要了解一些...

  • ffmpeg之时间戳 - PTS ,DTS

    TOC 视频的显示和存放原理 对于一个电影,帧是这样来显示的:I B B P。现在我们需要在显示B帧之前知道P帧中...

  • ffmpeg 编解码时间戳详解

    参考文章: http://blog.chinaunix.net/uid-26000296-id-3483782...

  • FFmpeg常用命令

    FFMPEG 使用说明 分段录制+重置时间戳 混合录制 以时间戳命名文件夹 连接方式 列本机设备 调用本级摄像头 ...

网友评论

      本文标题:ffmpeg 时间戳、时间基准

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