文档章节

通俗的解释下音视频同步里pcr作用

j
 jane_linux
发布于 2017/05/17 09:10
字数 1696
阅读 23
收藏 0
PCR同步在非硬件精确时钟源的情况还是谨慎使用,gstreamer里面采用PCR同步,但是发现好多ffmpeg转的片儿,或者是CP方的片源,pcr打得很粗糙的,老是有跳帧等现象。 音视频同步,有三种方法,视频同步音频,音频同步视频,同步到外部时钟! 第三种,同步到外部时钟也就是PCR同步,和我上面说的那种同步方式,一样! 用的最多的还是,视频同步音频,为什么呢?音频的采样率是固定的,若音频稍有卡顿,都会很明显的听出来,反则视频则不如此,虽然表面上说的是30fps,不一定每一帧的间隔就必须精确到33.33ms,因为人肉眼是观察不出来的,所以视频的帧率可以是动态的,并不是严格标准的! 用视频同步音频,做法很简单!首先,音频线程只管自己独立解码播放。视频线程在显示之前只需要检测视频PTS是否大于音频PTS,若大,则等待音频PTS>=视频PTS,若小,则直接播放,小太多则可以直接丢弃(跳帧)。做法就如此简单!但前提是你编码器一定要打好正确的PTS,若没有则只有自己伪造PTS了! 音视频同步和帧率控制其实是一个东西。我们先不管音视频同步是什么,我们先来看看如何进行帧率控制。明白了帧率控制,音视频同步就有了基础认识。 1、帧率控制 帧率控制的方法有千万种,最2的方法无非是每解码/显示一帧就进行延时,为了方便我们在进行帧率控制的同时能够理解音视频同步,我在此采用PCR同步的方式来进行帧率控制。网上关于PCR同步的原理讲了一大堆,有些很是难懂,一点儿也不通俗,我这里来给大家把晦涩的理论以最通俗的方式表达出来。 拿1280x720@30p的视频源来做理解。30P也就是说每秒钟30帧,也就是每一帧需要1/30*1000ms大概也就是每隔33.33ms就必须显示一帧。 要想知道如何正确的进行解码,就必须先了解编码端是如何工作的!一般编码器会以27MHZ的时钟来进行编码,这些都不重要,重要的就是,编码器一般默认会每隔30ms会发送一次PCR信息,这里的PCR信息就很重要了,他是我们在解码端解码进行帧率控制的时间基点,同时也是我们以后在进行同步校准的校准基点。 说了这么多,那么我就拿个PCR信息来给大家分析分析。PCR信息是33bit组成的一个int64的数据,从解复用器里面出来我们可以得到一个很庞大的数字,看这个我们当然看不太懂!但是如果知道这个数字如何生成的那就好理解多了! PCR信息说白了就是给视频的时间戳信息,比如一部电影是从 (00:01:23:033)时 : 分 : 秒 : 毫秒 开始,那么这个时间基点生成的PCR信息就是 (((00*60+1)*60+23.033)*90K)%2^33。90K为27M,300分频的结果。刚刚说了PCR会每30ms更新一次,那么PCR每次递增的数值就为0.030*90K=2700,这和PTS的值原理是相同的,这里先提一下,其实这个增量也不重要。我们需要的只是第一个PCR值就OK,但是如果考虑到后期校准,还是要用到以后的PCR值的。这里先不管校准的问题! 说了PCR,还有个值是我们需要的,那就是PTS。其实对于硬解码器来说DTS信息我们根本就不需要管他,我们只需要一帧一帧的把数据送进去,顺便把每一帧的PTS信息送进去,解码器送出来的就是排列好了PTS信息的帧了(ffmpeg)。可以试着把解复用后的每一帧的PTS打印出来,你会发现在解复用后一般是这样排列的9000 3000 6000 18000 12000 15000.......这种是AVC编码的使用的是预测编码决定的,先不管他,你只管这样把每一帧依次送入解码器,解码器解码输出后自然就排列成3000 6000 9000 12000 15000 18000这才是我们需要的PTS!至于什么是PTS,实际上和PCR原理差不多,但是有个关键的地方PTS的增量值可不是默认的30ms了,他是由视频的帧率来决定的!说道重要的地方了哈!根据上面PCR的原理,如果是30p的视频那么每一帧就是1/30这么多的增量,再乘90K=3000。 说透了,我们这里就是利用这个PTS值来进行同步顺便进行帧率控制! 关键的地方来了! 如果视频流现在来了,我们先获取到第一个PCR值为1230000,我们现在马上在解码器端重建一个90K的时钟!这就是关键所在,至于如何重建90K的时钟,说白了就是开一个定时器,定时时间为1/90K(11.11us),每隔11.11us我们就把PCR计数值+1,同时这时候解码器也在工作,试想一下,如果是30P的视频,也就是33.33ms显示一次,那么当过了33.33ms后,PCR的数值加到好多了呢?没错就是33.33ms/11.11us=3000,这个增量不是和PTS的增量一摸一样!这时候你只需要在解码线程里判断当前帧的PTS是不是和这个PCR相等,如果相等就显示,如果PCR大可以丢弃当前帧,也就是说的跳帧,如果PCR小说明解码快了,这个时候就可以等待定时器线程到PCR==PTS。 这样就很巧妙的解决了帧率控制的问题了!同理,音视频同步也可以这样!你可以让音频的PTS去和PCR对比!其实大多数情况下都是以视频同步音频,音频解码不用管它,直接解码播放就OK了,你只需要进行帧率控制就OK了!同时注意随着时间的推移有可能出现延时,那么这个时候就需要重新来获取PCR来更新定时器线程里面的PCR基值了!

本文转载自:http://www.cnblogs.com/shakin/p/6567766.html

共有 人打赏支持
j
粉丝 0
博文 10
码字总数 970
作品 0
私信 提问
hls之m3u8、ts流格式详解

HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行...

souldepth
2016/04/27
12.5K
1
PCR的物理意义

1.PCR 仅仅在实时播出流中才有意义(即前端编码器实时编码或视频服务器实时播出,后端机顶盒实时接收的情况),对DVD机这类从文件中取TS流的设备PCR毫无意义。 2.前端编码器工作原理:编码器...

sunrc
2014/06/11
0
0
Android MediaMuxer录像(支持G711音频)

Android平台的MediaMuxer是个非常好的录像库,它能将H.264视频+AAC音频存储成.mp4格式的文件,而且稳定性、同步效果都非常好。 MediaMuxer在安卓版的EasyPlayer和EasyPusher都用到了该方法来...

jyt0551
2017/05/27
0
0
Android NDK开发之旅28--NDK--音视频基础知识与FFmpeg配置

音视频基础知识 视频播放器原理 一个最简单的视频播放器的过程(不包括视频加密等等过程): 视频播放器原理.jpg 这是一个视频播放的最基本的原理流程图,从这个图可以很整体得看到视频处理的...

香沙小熊
2017/12/04
0
0
音视频相关基础知识

前言 音视频相关的基础知识网上层出不穷,我们要善于站在巨人的肩膀上去学习,本篇博客将基于雷老师(雷霄骅)的博客以及讲课ppt,如果没有雷老师的无私奉献,就没有我们宝贵的学习资料,愿老...

浮生若梦zp
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

FinderWeb2.4.9 程序员的看日志利器

FinderWeb2.4.9 程序员的看日志利器 使用方法:管理员登录,分配对应用户的的主机和文件权限即可。 部署方式: 下载并解压到webapps目录即可 http://www.finderweb.net/download/finder-web...

吴伟祥
27分钟前
2
0
PHP的pcntl进程控制教程一(pcntl_fork)

pcntl 简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档...

hansonwong
32分钟前
2
0
php扩展模块安装

11月21日任务 11.32 php扩展模块装安装 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ wget https://codeload.github.com/phpredis/phpredis/zip/deve......

zgxlinux
33分钟前
3
0
windows下使用IDEA创建VUE项目

1.环境搭建 1.1检测是否安装好nodejs和npm 检测命令 node -v npm -v 如果没有安装需要先安装 nodejs的下载路径:https://nodejs.org/en/download/ 在Windows上安装时务必选择全部组件,包括勾...

文文1
40分钟前
3
0
Mybatis插件plugin应用测试,替换查询sql

1、新建插件 import org.apache.ibatis.executor.CachingExecutor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;im......

jcc_codingBoy
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部