文档章节

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

j
 jane_linux
发布于 2017/05/17 09:10
字数 1696
阅读 18
收藏 0
点赞 0
评论 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
Android NDK开发之旅30--FFmpeg视频播放

1.播放多媒体文件步骤 通常情况下,我们下载的视频文件如MP4,MKV、FLV等都属于封装格式,就是把音视频数据按照相应的规范,打包成一个文本文件。我们可以使用MediaInfo这个工具查看媒体文件...

香沙小熊
2017/12/08
0
0
Android NDK开发之旅33--FFmpeg音视频同步播放用C实现

前言 基于Android NDK开发之旅30--FFmpeg视频播放、Android NDK开发之旅32--FFmpeg+AudioTrack音频播放 这篇这两篇文章,我们对音频播放和视频播放有了基本了解。但是,要做到音视频同步播放...

香沙小熊
2017/12/30
0
0
直播,音视频编码器和解码器(EasyDarwin)-Android

使用摄像头采集视频数据,并通过MediaCodec进行H264编码,之后打包成RTSP格式并上传的。 TextuewView也提供了一个setTransform方法,该方法接收一个matrix参数,使用该参数对当前的渲染内容进...

shareus
05/18
0
0
现代IM系统中聊天消息的同步和存储方案探讨

本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经...

JackJiang2011
2017/11/24
0
0
java并发包里的CountDownLatch的用法

CountDownLatch 官方的解释为:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 我们现在就把它理解为倒数计数器,什么是倒数计数器呢,通俗的理解...

汪林
2014/06/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx配置error_page 404 500等自定义的错误页面

Nginx 做web server时, 开发中发现有时候的网站代码有错误,我们需要跳转到一个指定内容的错误页面: 1. 在nginx.conf配置文件上加上一句: fastcgi_intercept_errors on; 2. 服务中加上: er...

MichaelShu
刚刚
0
0
社区系统:如何搭建旅游攻略社区

随着国内经济的快速发展,人民经济收入和生活水平的提高,越来越多的人们在节假日会选择旅行,旅游行业蓬勃发展,并呈逐年上升趋势,同时,大多数游客尤其是自由行游客会在旅行前访问旅行攻略...

ThinkSNS账号
1分钟前
0
0
微服务架构下的监控系统设计(一)——指标数据的采集展示

前言 微服务是一种架构风格,一个大型复杂软件应用通常由多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。...

UCloudTech
6分钟前
0
0
极客时间《趣谈网络协议》之开篇词学习笔记

出于个人兴趣,本人在极客时间购买了网易研究院云计算技术部的首席架构师刘超老师关于计算机网络的专栏之《趣谈网络协议》,由于知识版权原因,不能直接分享刘超老师的原文,所以,我会在每次...

aibinxiao
8分钟前
0
0
Activiti - 新一代的开源 BPM 引擎

Activiti 背景简介、服务和功能介绍 董 娜, 狄 浩, 和 张 晓篱 2012 年 7 月 23 日发布 背景介绍 Activiti 其核心是 BPMN 2.0 的流程引擎。BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准,全...

孟飞阳
14分钟前
0
0
最有效的方式来适配

最有效的方式来进行屏幕适配 在上代码之前先把屏幕相关的几个概念搞清楚:Density、DensityDpi、ScaleDensity。这里我们不过多讲解这些概念知识。 1.0 获取设计图的屏幕尺寸:这里我以360dp...

android-key
16分钟前
0
0
微信授权代码翻译样本

var a,b,c,d = ngx.call(1,2,3)var e = [];var f ;var g = function () {}var h = 1;var c = "abcdefg" + "222";var d = "asdasdasd" + a;var a = ngx >>> log();//......

钟元OSS
18分钟前
0
0
5、二维码生成工具类

一、maven引入依赖jar包 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.......

丑陋的皮囊
18分钟前
0
0
正则表达式

以前用正则表达式很少,大部分情况下matches一下就好了,这次遇到的情况比较特殊,因为对截取出来的数据比较敏感(日期),所以就重新熟悉了一下,感觉有必要记录一下: /** * 从字符串中...

lost_keke
20分钟前
2
0
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部