视频流中的DTS/PTS究竟是什么? 

    DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳。SCR能够理解为解码器应该開始从磁盘读取数据时的时间。

    mpeg(当前很多其它的是使用H.264视频技术。如AnyChat SDK)開始)。

    DTS 时间戳决定了解码器在SCR时间等于DTS时间时进行解码,PTS时间戳也是类似的。通常,DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时 间。

比如,假设一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差点儿相同是200
/280ms。表明当SCR到200ms时这个视频数据应该被解码并在80ms以后被显示出来(视频数据在一个buffer中一直保存到開始解码)下 溢通常发生在设置的视频数据流相关mux率太高。

      秒钟内不可以读取足够的视频数据。这样的情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示(DTS/PTS时间戳就要比包括它们的数据包中的SCR时间要早了)。

现在依靠解码器。这基本已经不是什么问题了(虽然MPEG文件由于应该没有下溢而并不全然符合MPEG标准)。一些解码器(非常多著名的基于PC的播放器)尽可能快的读取文件以便显示视频。能够的话直接忽略SCR。

       注意在你提供的列表中,平均的视频流速率为~3Mbps(3000000bits/sec)可是它的峰值达到了14Mbps(相当大,DVD限制在 9.8Mbps内)。这意味着mux率须要调整足够大以处理14Mbps的部分。 bbMPEG计算出来的mux率有时候太低而导致下溢。

添加mquant的值并且在视频设置中将最大码流设置为9Mbps以保持一个小一点的码流。

     假设你确实想让视频码率那么高,你须要增大mux率。从提供的列表能够得出bbMPEG使用14706800bits/sec或者1838350bytes
/sec的mux率(总数据速率为:1838350bytes/sec(14706800bits/sec)行)。你在强制mux率字段设置的值应该是以

bytes/sec(1838350/50)開始,一直添加直到不会再出现下溢错误为止。

音视频同步原理[ffmpeg]

ffmpeg对视频文件进行解码的大致流程:

1. 注冊全部容器格式和CODEC: av_register_all()

2. 打开文件: av_open_input_file()

3. 从文件里提取流信息: av_find_stream_info()

4. 穷举全部的流。查找当中种类为CODEC_TYPE_VIDEO

5. 查找相应的码器: avcodec_find_decoder()

6. 打开编解码器: avcodec_open()

7. 为解码帧分配内存: avcodec_alloc_frame()

8. 不停地从码流中提取中帧数据: av_read_frame()

9. 推断帧的类型,对于视频帧调用: avcodec_decode_video(

10. 解码完后。释放解码器: avcodec_close()

11. 关闭输入文件:av_close_input_file()

output_example.c 中AV同步的代码例如以下(我的代码有些改动),这个实现相当简单,只是挺说明问题。

音视频同步-时间戳 

媒体内容在播放时,最令人头痛的就是音视频不同步。从技术上来说,解决音视频同步问题的最佳方案就是时间戳:首先选择一个參考时钟(要求參考时钟上的时间是线性递增的)。生成数据流时根据參考时钟上的时间给每一个数据块都打上时间戳(一般包含開始时间和结束时间);在播放时,读取数据块上的时间戳,同一时候參考当前參考时钟上的时间来安排播放(假设数据块的開始时间大于当前參考时钟上的时间。则不急于播放该数据块。直到參考时钟达到数据块的開始时间;假设数据块的開始时间小于当前參考时钟上的时间,则“尽快”播放这块数据或者索性将这块数据“丢弃”,以使播放进度追上參考时钟)。



        可见,避免音视频不同步现象有两个关键——一是在生成数据流时要打上正确的时间戳。假设数据块上打的时间戳本身就有问题。那么播放时再怎么调整也于事无补。假如。视频流内容是从0s開始的。假设10s时有人開始说话,要求配上音频流,那么音频流的起始时间应该是10s。假设时间戳从0s或其他时间開始打,则这个混合的音视频流在时间同步上本身就出了问题。打时间戳时。视频流和音频流都是參考參考时钟的时间。而数据流之间不会发生參考关系。也就是说,视频流和音频流是通过一个中立的第三方(也就是參考时钟)来实现同步的。

第二个关键的地方,就是在播放时基于时间戳对数据流的控制,也就是对数据块早到或晚到採取不同的处理方法。图2.8中,參考时钟时间在0-10s内播放视频流内容过程中。即使收到了音频流数据块也不能马上播放它,而必须等到參考时钟的时间达到10s之后才干够,否则就会引起音视频不同步问题。

基于时间戳的播放过程中,只对早到的或晚到的数据块进行等待或高速处理,有时候是不够的。

假设想要更加主动而且有效地调节播放性能,须要引入一个反馈机制,也就是要将当前数据流速度太快或太慢的状态反馈给“源”,让源去放慢或加快数据流的速度。

熟悉DirectShow的读者一定知道,DirectShow中的质量控制(Quality
Control)就是这么一个反馈机制。DirectShow对于音视频同步的解决方式是相当出色的。

但WMF
SDK在播放时仅仅负责将ASF数据流读出并解码,而并不负责音视频内容的终于呈现。所以它也缺少这种一个反馈机制。

音视频技术 即时通讯SDK的更多相关文章

  1. 腾讯技术分享:微信小程序音视频技术背后的故事

    1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...

  2. 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化

    本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...

  3. iOS 即时通讯SDK的集成,快速搭建自己的聊天系统

    现在的外包项目需求变态的各种各样,今天要做社交,明天要加电商,后天又要加直播了,这些系统如果要自己开发,除非大公司技术和人力都够,不然短时间是几乎实现不了的.所以学会灵活利用市面上的各种SDK是灰常重 ...

  4. 音视频技术“塔尖”之争,网易云信如何C位出道?

    音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...

  5. Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向

    最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...

  6. 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!

     下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料 ...

  7. Android 音视频技术之录音获取实时音量

    一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...

  8. App 即时通讯 SDK

    1.网易云信 http://netease.im/ 2.环信 http://www.easemob.com/customer/im 3.融云 http://www.rongcloud.cn/ 4.极光 ...

  9. 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践

    1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...

随机推荐

  1. wait, WIFEXITED, WEXITSTATUS

    wait, WIFEXITED, WEXITSTATUS     偶尔翻到了这几个关键字,找到个文章复习了下:“点我”.记录下: wait的函数原型是: #include <sys/types. ...

  2. MySQL遇到的一个卡库问题及对update的学习

    近日遇到个卡库的问题,环境是MySQL5.5.12,报错信息如下 ) and was aborted. There is a chan ce that your master is inconsist ...

  3. Git 中文件的状态和流转区

    Git的文件主要处于三种状态,分别是 staged, modified, committed. Git文件流转有三个区域,分别是 工作区域. 索引区域. 本地数据区域. 要修改对一个文件进行操作,首先 ...

  4. 不用call和apply方法模拟实现ES5的bind方法

    本文首发我的个人博客:前端小密圈,评论交流送1024邀请码,嘿嘿嘿

  5. Android调用系统相机、自定义相机、处理大图片

    Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...

  6. 仿LOL项目开发第四天

    ---恢复内容开始--- 仿LOL项目开发第四天 by草帽 上节讲了几乎所有的更新版本的逻辑,那么这节课我们来补充界面框架的搭建的讲解. 我们知道游戏中的每个界面都有自己的一个类型:比如登陆界面,创建 ...

  7. 排查Hive报错:org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start of Array expected

    CREATE TABLE json_nested_test ( count string, usage string, pkg map<string,string>, languages ...

  8. jquery省市选择案例

    1.代码实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别以及接口里default方法

    使用大写字母A,B,C,D......X,Y,Z定义的,就都是泛型,把T换成A也一样,这里T只是名字上的意义而已 ? 表示不确定的java类型 T (type) 表示具体的一个java类型 K V ( ...

  10. 数学图形(2.7)sphere sine wave

    在球上以SIN曲线的轨迹游走. #http://www.mathcurve.com/courbes3d/couronnetangentoidale/couronnetangentoidale.shtm ...