音视频中的DTS和PTS区别

这篇具有很好参考价值的文章主要介绍了音视频中的DTS和PTS区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是PTS、DTS

1.PTS:即显示时间戳,用来告诉播放器在什么时候显示这一帧数据

2.DTS:即解码时间戳,用来告诉播放器在什么时间来解码这一帧的数据

3.GOP:MPEG使用的一种视频压缩技术

总的来说PTS和DTS用于指导播放器端的行为

二,了解视频采集到编码推流

        在视频采集的时候是录制一帧就编码一帧发送一帧,在编码的时候会生成PTS,在通常情况下,编码器在编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准对一个未来帧P帧进行编码,然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。之后编码器会再次跳过几个帧,使用第一个P帧作为一个基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列的空隙。这个过程不断继续,每12到15个p帧和B帧内插入一个新的I帧。P帧由前一个I帧或P帧图像来预测,而B帧由前后的两个P帧或一个I帧和一个P帧来预测。如下图所示:

假设采集到的帧是这样的:

I B B P B B P

那么它的PTS对应的是1234567

编码顺序是 1423756

推流顺序也是按照编码顺序去推的即

I P B B P B B

那么接受端的视频流也就是

I P B B P B B

这时候去解码,也是按照收到的视频流一帧一帧去解得了,接收一帧解码一帧,所以解码的顺序的这样的

I P B B P B B

DTS:1234567

PTS:1423756

可看到解码出来对应PTS不是顺序的,为了正确显示视频流,这时候我们必须按照PTS调整解码后的帧,即

I B B P B B P

DTS:1342675

PTS:   1234567

其实就是把PTS按照顺序递增的方式排列下

总而言之,在音视频中,PTS通常是按照递增顺序排列的,以保证正确的时间顺序和播放同步。

三、应用实例

        在没有B帧的情况下,DTS和 PTS 的输出顺序是一样的,一旦存在 B 帧,则顺序不一样。 这里,我们只需要关心 PTS ,即显示时间戳。通过 MediaCodec.BufferInfo 的 presentationTimeUs 可以拿到当前的 pts 时间戳,单位是微妙,它是相对于0开始播放的时间,所以,我们可以使用系统时间差来模仿两帧的时间差,这样当解码过来的 pts 比这个时间差快,则延时以下再输出到 Surface ,如果不是,则直接显示到 Surface 中

 // 用于对准视频的时间戳
 private long startMs = -1;
if (outputId >= 0){
     if (mStartMs == -1) {
            mStartMs = System.currentTimeMillis();
      }
    //矫正pts
     sleepRender(info, startMs);
     //释放buffer,并渲染到 Surface 中
     mediaCodec.releaseOutputBuffer(outputId, true);
 }
#sleepRender
    /**
     * 数据的时间戳对齐
     **/
    private void sleepRender(MediaCodec.BufferInfo info, long startMs) {
        /**
         * 注意这里是以 0 为出事目标的,info.presenttationTimes 的单位为微秒
         * 这里用系统时间来模拟两帧的时间差
         */
        long ptsTimes = info.presentationTimeUs / 1000;
        long systemTimes = System.currentTimeMillis() - startMs;
        long timeDifference = ptsTimes - systemTimes;
        // 如果当前帧比系统时间差快了,则延时以下
        if (timeDifference > 0) {
            try {
                Thread.sleep(timeDifference);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

使用上面的代码示例,可以达到让播放器以正常速度解码视频,不会出现倍速播放的效果文章来源地址https://www.toymoban.com/news/detail-792331.html

到了这里,关于音视频中的DTS和PTS区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android音视频: 引入FFmpeg

    本文你可以了解到 本文将介绍如何将上一篇文章编译出来的  FFmpeg so  库,引入到  Android  工程中,并验证  so  是否可以正常使用。 一、开启 Android 原生 C/C++ 支持 在过去,通常使用  makefile  的方式在项目中引入  C/C++  代码支持,随着  Android Studio  的普及, makefile  的

    2024年02月02日
    浏览(31)
  • Android音视频之协议介绍

    本文对音视频的协议起源做详细介绍,学习之后可以加深对音视频知识的了解。 这里的音视频不仅针对Android平台,其他平台也通用。 一般是指以某种格式封装了音视频数据的文件 常见的音频格式:mp3、wma、avi、rm、rmvb、flv、mpg、mov、mkv等。 常见的视频格式:rmvb、rm、wmv、

    2023年04月19日
    浏览(40)
  • Android 音视频开发 - VideoView

    本篇文章主要介绍下Android 中的VideoView. VideoView是一个用于播放视频的视图组件,可以方便地在应用程序中播放本地或网络上的视频文件。 VideoView可以直接在布局文件中使用,也可以在代码中动态创建。 它封装了MediaPlayer和SurfaceView,提供了简单的接口来控制视频的播放和显示

    2024年04月08日
    浏览(80)
  • Android之 集成音视频通话

    一,背景 1.1 最近接收一个即时通讯二开项目,即时通讯部分用的XMPP协议,音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的开源框架。但客户想要微信那种页面的排版,后来经研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative写的,这样难度就大了

    2024年02月12日
    浏览(43)
  • Android音视频开发 - MediaMetadataRetriever 相关

    MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等. 需要申请 读写权限 . 这里我使用的是本地路径, 需要注意的是如果路径文件不存在,会抛出 IllegalArgumentException,具体的源码如下: 根据keyCode返回keyC

    2024年04月08日
    浏览(39)
  • Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流

    2024年02月10日
    浏览(46)
  • Android音视频开发实战01-环境搭建

    FFmpeg 是一款流行的开源多媒体处理工具,它可以用于转换、编辑、录制和流式传输音视频文件。FFmpeg 具有广泛的应用场景,包括视频编解码、格式转换、裁剪、合并、滤镜等等。官网:https://ffmpeg.org/ FFmpeg 支持各种常见的音视频格式,例如 MP4、AVI、FLV、MOV、AAC、MP3、M4A 等等

    2024年02月10日
    浏览(38)
  • Android音视频开发实战02-Jni

    JNI是Java Native Interface的缩写,是Java提供的一种机制,用于在Java代码中调用本地(C/C++)代码。它允许Java代码与本地代码进行交互,通过JNI,Java应用程序可以调用一些原生库或者操作系统API,以获取更好的性能和更强的功能支持。 使用JNI需要编写一些Native方法,并将其实现在

    2024年02月11日
    浏览(38)
  • Android音视频——OpenMAX (OMX)框架

    本文分为两个部分进行讲解 Codec 部分中的 AwesomePlayer 到 OMX 服务 前面介绍了NuPlayer最终解码都会到达OMX框架,也就是 OpenMAX框架,本文开始分析编解码部分中的AwesomePlayer到OMX服务过程,也就是开启OpenMAX准备相关内容。Android系统中用OpenMAX来做编解码,Android向上抽象了一 层O

    2023年04月09日
    浏览(37)
  • 音视频中的基本概念

    操作系统中的文件名都有后缀,即扩展名,例如1.doc,2.jpg,3.avi等。设置扩展名的目的是让系统中的应用程序来识别并关联这些文件,让相应的文件由相应的应用程序打开。常见的文件格式如1.avi,2.mpg,3.mp4这些都叫做视频的文件格式,可由电脑上安装的视频播放器关联和打

    2024年02月17日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包