zoukankan      html  css  js  c++  java
  • 时间戳杂谈(二)

    时间戳由时间基准和时间戳值组成。

    时间基准:对时间单位(s)划分的标准。

    比如,1/25表示每秒分为25个单位,每一个单位时间间隔包括1个单位。

    3001/90000表示每秒分为90000单位,每一个单位时间间隔包括3001个单位。

    时间戳值:基于时间基准的时间表示,也即多少个单位时间间隔。


    1)时间戳的作用是用于精确标记音视频流的相对位置和持续时间。

    2)基于时间基准使用时间戳。而不是直接使用整数值的意义在于,时间戳可以避免不可以整除的情况。

    3)不同的时间基准之间的时间戳转换存在误差,应该避免不必要的转换。

    假设的确须要转换。应该保证转换后的时间戳不小于转换前。

    4)不同一时候间基准直接的时间戳比較,应该首先转换到划分更细的单位上(1/1hns)进行。

    5)系统时钟相当于1/1000的时间戳,音视频播放同步。实际就是流自身的时间戳与系统时间戳的一个比較。

    因为时间戳转换存在误差。所以播放同步实际也是存在误差。

    所以不要纠结于等号,而是尽量设置一个可容忍的误差时长。



    ffmpeg中时间戳转换

    AVFormatContext->AVPacket ->AVFrame ->AVPacket->AVFormatContext

         AVStream        AVCodecContext          AVStream

    解码过程:因为AVStream与AVCodecContext是AVFormatContext在文件解析过程创建的。因此两者的time_base应该是一致的。

    AVPacket到AVFrame的时间戳值不变。

    编码过程:AVCodecContext的time_base由用户设置(默认是1/90000)。AVStream中的time_base是默认值1/90000(ffmpeg在write_header会改动以匹配AVCodecContext值),两者值不一定相等。因此须要进行时间戳值转换。

  • 相关阅读:
    Football Foundation (FOFO) TOJ 2556
    JAVA- String类练习
    JAVA- 清除数组重复元素
    Mysql远程登陆错误:ERROR 2003
    Linux学习之路(五)压缩命令
    Linux学习之路(四)帮助命令
    如何识别真Microsoft服务与非Microsoft服务来定位病毒自己的服务
    如何用命令行删除EasyBCD开机选择项?
    JAVA- 成员变量与局部变量的区别
    JAVA- 内部类
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5184235.html
Copyright © 2011-2022 走看看