ts 流中pcr 介绍

news/2024/5/20 2:53:13 标签: ts, pcr

在数字电视传输码流中。节目时钟基准 (PCR) 也是一种重要的包头信息,

1. pcr 能表示的时间范围
它由 33bit 基值 (Base) 和 9bit 扩展值 (Extension) 组成。
#define PCR_TIME_BASE 27000000
pcr 为1 代表1/27M 时间,
pcr 的最大表示时间为(2^33*300+299)/27000000=95443.7177秒 
95443.7177/3600=26.512小时


2. pcr 的内存存储
节目时钟是27M 为基准单位,在内存中存储占用6个bytes, 如下代码所示.:
static int write_pcr_bits(uint8_t *buf, int64_t pcr)
{
    int64_t pcr_low = pcr % 300, pcr_high = pcr / 300;

    *buf++ = pcr_high >> 25;
    *buf++ = pcr_high >> 17;
    *buf++ = pcr_high >>  9;
    *buf++ = pcr_high >>  1;
    *buf++ = pcr_high <<  7 | pcr_low >> 8 | 0x7e;
    *buf++ = pcr_low;

    return 6;
}

3. pcr 的数值生成
#define PCR_TIME_BASE 27000000
static int64_t get_pcr(const MpegTSWrite *ts)
{
    return av_rescale(ts->total_size + 11, 8 * PCR_TIME_BASE, ts->mux_rate) +
           ts->first_pcr;
}

1秒钟,pcr要走27M, 所以pcr 计算是 时间*27M
时间=(发送的总大小*8/mux_rate)
用函数表示: rescale(total_size,8*27M,mux_rate), 再加一个原始偏移,代码即理解了.
可见pcr 值决定于发送的数据量.


4. pcr 应用
在mpegtsenc.c第1600行, 有
if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
    av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");

要求传来的dts 不能小于pcr/300, 否则会有一个warning 警告! 不过后面它该干的都干了.

何时write_pcr?
考察,cbr 模式, 此时mux_rate 为有效.
1. 
    if (pcr >= ts->next_pcr) { write_pcr=1;}

    当发送的数据量足够多了(当前pcr),多于下一个next_pcr, 就要插入一个pcr
    next_pcr 的计算:
    next_pcr = FFMIN(next_pcr, ts_st2->last_pcr + ts_st2->pcr_period);

当dtspcr/300 差距大于delay 时,要插入pcr 或者空包
    if ((dts - pcr / 300) > delay) {
        /* pcr insert gets priority over null packet insert */
        if (write_pcr)
            mpegts_insert_pcr_only(s, st);
        else
            mpegts_insert_null_packet(s);
        /* recalculate write_pcr and possibly retransmit si_info */
        continue;
    }


dts 被重新计算过.
 


http://www.niftyadmin.cn/n/5401757.html

相关文章

自定义镜像上传阿里云

前言 上篇博主已经讲解过了自定义镜像&#xff0c;跟上篇文章我们继续衍生自定义镜像https://blog.csdn.net/2302_76638140/article/details/136352907 一、jdk两个版本的制作 二、镜像上传阿里云及下载 三、配置阿里云镜像仓库代码托管网址

百度百科人物创建要求是什么?

百度百科作为我国最大的中文百科全书&#xff0c;其收录的人物词条要求严谨、客观、有权威性。那么&#xff0c;如何撰写一篇高质量的人物词条呢&#xff1f;本文伯乐网络传媒将从内容要求、注意事项以及创建流程与步骤三个方面进行详细介绍。 一、内容要求 1. 基本信息&#…

springboot + nacos + aws secretmanager 做账号密码隐私处理

方式一&#xff1a; #nacos配置文件data.yml: spring:cloud:nacos:discovery:ip: ****.comport: 80datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://*********/database?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&fail…

CryoEM - 使用 cryoSPARC 基于单颗粒图像从头重构蛋白质三维结构

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 基于冷冻电镜单颗粒图像重构蛋白质三维结构,利用冷冻电镜技术测定生物大分子结构的方法。原理是从冷冻电镜获得大量同一种蛋白质分子的二维投影图…

Unity脚本,串行端口的握手协议(流控制)

在Unity的SerialPort构造函数中&#xff0c;流控制并没有被直接包含。流控制&#xff0c;也被称为握手&#xff0c;是一种过程&#xff0c;它管理数据的传输速度&#xff0c;以防止接收方被发送方发送的数据量所淹没。 在.NET的SerialPort类中&#xff0c;流控制是通过Handshak…

《PyTorch深度学习实践》第十二讲循环神经网络基础

一、RNN简介 1、RNN网络最大的特点就是可以处理序列特征&#xff0c;就是我们的一组动态特征。比如&#xff0c;我们可以通过将前三天每天的特征&#xff08;是否下雨&#xff0c;是否有太阳等&#xff09;输入到网络&#xff0c;从而来预测第四天的天气。 我们可以看RN…

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用&#xff0c;在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中&#xff0c; 实例对象的方法主要存储在类的方法列表中&#xff0c;类方法则是主要存储在原类中。 向对象发送消息&#xff0c;核心…

java 正则表达式介绍

Java正则表达式是一种强大的文本处理工具&#xff0c;它允许你进行模式匹配、搜索和文本操作。正则表达式提供了一种简洁、灵活的方式来处理字符串&#xff0c;可以用于各种应用场景&#xff0c;如数据验证、文本解析、搜索和替换等。 正则表达式的基础知识 正则表达式…