来在研究HLS(HTTP Live Streaming),以实现android上播放m3u8文件。由于TS段的切分不统一,每个视频网站给出的m3u8 playlists总有差别,在时间戳显示上有差异,所以对DTS和PTS进行了研究。

DTS和PTS是音视频同步的关键技术,同时也是丢帧策略密切相关。

dts/pts定义 dts: decoding time stamp pts: present time stamp

在ISO/IEC13818-1中制定90k Hz 的时钟,如果编码帧频是30,那么时间戳间隔就该是90000 / 30 = 3000。 在FFMPEG中有三种时间单位:秒、微秒和dts/pts。从dts/pts转化为微秒公式:

其中AV_TIME_BASE为1,000,000,denominator为90,000。 拿到m3u8播放列表后,首先进行解析。HTTP Live Streaming标准草案可以从这里http://tools.ietf.org/html/draft-pantos-http-live-streaming-08查看。 解析代码在ffmpeg/libavformat/hls.c中
  parse_playlist函数
解析播放列表的问题
   
当解析到#EXT-X-TARGETDURATION标签时,后面紧跟着的是TS段的最大时长,当前没有什么用。#EXTINF标签后紧跟的是当前TS段的时长,当EXT-X-VERSION标签大于等于3时,TS段的时长可以为小数,当前(2012-07-26)的FFMPEG代码还不支持EXT-X-VERSION标签的判断,TS段的时长也为整数。保存了当前段的时长,单位为秒。
   
当前草案中还有EXT-X-DISCONTINUITY标签,它表征其后面的视频段文件和之前的不连续,这意味着文件格式、时间戳顺序、编码参数等的变化。但是很遗憾,当前FFMPEG仍然不支持,这意味着该标签出现后,后续的PES中携带的dts和pts将重新从零开始计数。

  seek_timestamp为标志位,它表征当前视频发生了SEEK事件,当发生SEEK事件后首先调用hls_read_seek()函数定位到应该读取的TS段,更新HLS上下文中的段序号。当读取到该段的packet,有两种判断。 在ffplay中,当外界发起seek请求后,将执行以下操作。
 
 
调用avformat_seek_file(),完成文件的seek定位
   
清空解码前packet队列(音频、视频、字幕)
 
调用avcodec_flush_buffers(),清空解码buffer和相关状态
 
在第一个步骤中,将在HLS层进行seek操作,seek流程图如下图所示:
http://image55.360doc.com/DownloadImg/2012/09/1315/26808238_1.png
http://image55.360doc.com/DownloadImg/2012/09/1315/26808238_1.png
首先读取packet,判断是否有seek操作,没有则直接将该packet返回,送人后续的解码操作。如果是seek情况,则读取dts时间戳,如果dts没有值,则直接清除seek标志并返回packet(问题一)。如果dts时间戳有值,则将该值转化为微秒并与seek传入的时间进行比较,看是否大于seek时间,如果大于则表明读取的packet达到了seek要求(问题二),否则继续读packet。如果seek时间已经满足,则看该packet的flags是否是关键帧,如果是则返回该packet(问题三),否则继续读packet。
该流程很简单,但是带来了三个问题。分别解释
 
问题一,如果dts没有值,返回回去后,解码状态全部进行了reset,则送入的第一帧信息应该为关键帧,否则该帧需要参考其他帧,产生花屏。
 
问题二,如果dts时间戳有误,将出现dts转化为微秒后永远小于seek传入时间问题,则永远无法返回packet,导致seek僵死。
 
问题三,判断packet是否为关键帧,忽略了该packet是否为视频,如果该packet为音频并且flag AV_PKT_FLAG_KEY的结果为真,则将返回该packet并清空seek标准。后续读到的视频也有非关键帧的可能,从而导致花屏。

DTS和PTS的分析(FFMPEG、HLS相关)相关推荐

  1. ffmpeg中的时间 DTS、PTS、AV_TIME_BASE、AV_TIME_BASE_Q 介绍

    ffmpeg中的时间 DTS.PTS.AV_TIME_BASE.AV_TIME_BASE_Q等介绍  原文:http://www.cnblogs.com/yinxiangpei/articles/38 ...

  2. SRS 代码分析【HLS切片】

    转载:http://blog.csdn.net/ManagerUser/article/details/76087151 一.前言         SRS流媒体服务器支持rtmp协议,但是rtmp协议 ...

  3. 音视频学习之ffmpeg时间戳相关整理(时间基tbr,tbn,tbc)

    1: I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含⼀幅完整的图像信息,属于帧内编码图像,不含运动⽮量,在解码时不需要参考其他帧图像.因此在I帧 ...

  4. 音视频中的DTS、PTS

    写这个还是为了给自己保存啊   勿怪啊 内容肯定都是老的 只给粉丝看了  琢磨存取证视频时和这个题目关联 欢迎讨论 whaosoft aiot http://143ai.com I.P.B 帧 I 帧 ...

  5. 从头用脚分析FFmpeg源码 - av_interleaved_write_frame | av_write_frame

    本文所使用的是FFmpeg n4.4的源码,所有分析均来自博主瞎猜,如果有误,欢迎批评指正. av_write_frame 作用 /*** Write a packet to an output me ...

  6. 视频流中的DTS、PTS到底是什么

    视频流中的DTS.PTS到底是什么 I.P.B 帧 要搞懂 DTS 和 PTS ,首先要先了解一下 I.P.B 帧. I 帧 : 帧内编码帧 又称intra picture,I 帧通常是每个 GOP( ...

  7. strace分析mysql_strace 命令分析mysql的相关的问题

    strace 命令分析mysql的相关的问题 使用方式: strace -p pid or strace command 本篇博文主要简单介绍下面关于MySQL的5个问题: 利用strace观察mys ...

  8. STC,PCR,DTS,PTS

    PTS和DTS是时标,每秒增加90k 这个在MPEG2文档中可以查到 The PTS/DTS flags in the packet header are set to indicate the pr ...

  9. H264中的时间戳(DTS和PTS)

    (1)Ffmpeg中的DTS 和 PTS H264里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp). 顾名思义,前者是解码的时 ...

最新文章

  1. Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合
  2. 最新阿里内推Java后端面试题
  3. android 调试
  4. JavaFX UI控件教程(二十五)之Color Picker
  5. 一亿像素下放!Redmi Note 10系列相机曝光:长焦微距全都有
  6. C#_基础,初始化器
  7. 雅马哈发电机换机油教程_康明斯柴油发电机组怠速一会就自动停机是什么故障...
  8. UIButton长度自适应文字长度
  9. 「不看后悔一辈子」Python100个游戏大合集(1~15)
  10. ExtJs6学习(二)【环境介绍,构建程序】
  11. 开源库openhtmltopdf html 转pdf特殊字符适配
  12. Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled
  13. springboot整合es实现聚合搜索(api搜索版)
  14. SQL练习题共50道附答案(MySQL
  15. 服务器项目迁移本地,云服务器迁移本地
  16. 修改Github仓库中项目语言类型
  17. 分布式数据库CAP原理
  18. oracle ebs r12 nls,Oracle EBS R12 - 如何通过命令上传XML/BI Publisher数据定义文件和模板文件...
  19. 从恒大亚冠夺冠夜看恒大营销
  20. Choreographer ——编舞者

热门文章

  1. 业界大盘点!文本相关性在搜广推三大场景中的应用!
  2. 奇葩!!!同为‘CST时区‘,java与mysql相差13个小时
  3. 一次讲透百度、华为、阿里、腾讯四朵云
  4. python爬虫框架论文开题报告范文_毕业论文开题报告范文5篇
  5. TRIZ - 发明问题解决理论
  6. SAS学习——Base SAS基础
  7. markdown编辑语法基础篇
  8. 毕设存档——APAP with moving dlt实现流程
  9. oracle replace 单引号替换
  10. python语言编写一个生成九宫格图片的代码_Python 生成你的朋友圈九宫格图片