PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)

简介: 本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。

简介

PyAV是FFmpeg库的python绑定。我们的目标是提供底层库的所有功能和控制,但是尽可能多地管理细节。
PyAV用于通过容器、流、包、编解码器和帧直接而精确地访问您的媒体。它公开了该数据的一些转换,并帮助您从其他包(例如Numpy和Pillow)获取数据。
这种能力确实带来了一些责任,因为与媒体打交道非常复杂,PyAV无法将其抽象出来,也无法为您做出所有最好的决定。如果ffmpeg命令在没有您向后弯腰的情况下完成了工作,那么PyAV可能是一个障碍而不是帮助。但是如果没有它就无法工作,PyAV是一个关键的工具。

总而言之:PyAV 是 FFmpeg 的 Python 接口

window or linux 安装

  • 第一步: 安装ffmpeg。下载ffmpeg shared,并将其目录下的bin目录添加到环境变量。安装方法:windows | linux
  • 第二步:安装PyAV。然后有两种方式安装PyAV:
    T2、到GitHub下载PyAV源码,解压后进入其目录执行
python setup.py build --ffmpeg-dir=D:/Program Files/ffmpeg
python setup.py install

注意
其中D:\Program Files\ffmpeg\bin是你的ffmpeg目录,一定要对!
或者
进入setup.py代码文件内,将

FFMPEG_DIR = None
改为
FFMPEG_DIR = 'D://Program Files//ffmpeg'

arm 安装

  • 第一步:ffmpeg安装同上面的linux
  • 第二步:装PyAV。然后有两种方式安装PyAV:
    T2、到GitHub下载PyAV源码,解压后进入其目录执行
sudo apt-get install -y python-dev python-virtualenv pkg-config
sudo sudo apt-get install -y libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev libswscale-dev libavresample-dev
pip3 install Cython
python3 setup.py build --ffmpeg-dir=/usr/local/ffmpeg
python3 setup.py install

安装错误

  • ModuleNotFoundError: No module named ‘av._core’ 解决方法
  • PyAV安装:段错误或者could not find libavdevice with pkg-config 解决办法

代码错误

  • max delay reached. need to consume packet 解决办法
  • Invalid NAL unit 17, skipping.在这里插入图片描述

时间戳说明

ffmpeg中常用的几个时间戳:

  • rtcp_ntp_timestamp: 真实时间, 绝对时间,在网络传输时的时间基(1 << 32),
  • rtcp_timestamp: rtcp时间,一般会有一个base, 在网络传输时的时间基90000
  • rtp_timestamp: rtp时间,和rtcp_timestamp类似,网络时间基90000
  • Avpacket->pts: 通过如上计算得到,video一般是以90000为基
  • timebase:通常为1/90000,表示时间戳的单位为1/90k秒

RTP和NTP

RTP : 相对时间,Real-time Transport Protocol(实时传输协议),RTP用来为IP网上的语音、图像、传真等多种需要实时传输的多媒体数据提供端到端的实时传输服务。RTP为Internet上端到端的实时传输提供时间信息和流同步,但并不保证服务质量,服务质量由RTCP来提供。

NTP:绝对时间,网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。NTP时间戳是从1900年1月1日00:00:00以来经过的秒数.

  • 首先明确:NTP时间戳有64位,其中32位表示second,32位表示 fraction second(就是秒后面的单位)表示的秒数起点为 0h UTC on 1 January 1900 (不同于Unix时间的起始于1970),fraction的单位为2^32 second

  • relation:rtp时间戳和ntp时间戳表示的意义是相同的. 可以互相转换(但未找到关系),rtp=f(ntp) 类似中文名张三,英文名zhangjohn.

  • summary:ntp,rtp,pts表示的是同一帧的时间.ntp是绝对时间,rtp是相对时间,pts是播放时间.rtp是用频率表示,pts是用秒表示.

PTS和DTS

PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码

PTS和RTP的关系
timebase往往取的1/90000
pts= rtp 时间戳 *timebase
每秒=pts*time_base

获取RTSP的各种时间戳(TCP)

如果用作视频流同步,则少不了对于时间戳的获取和同步,这里介绍了通过av和ntplib来获取我们的NTP_time、RTP_time、PTS_time、DTS_time,分别是网络时间协议(同步网络中各个计算机的时间的协议)

import av,cv2
import av.datasets
import datetime
import ntplib #这里的ntp不是海康设备的

if __name__ == '__main__':
    # rtp是相对时间,ntp是绝对时间
    # container = av.open('F:/epycharm/engineer/data/video/1.avi')
    url='rtsp://admin:a12345678@10.16.55.149:554/h264/ch1/main/av_stream'
    options = {
        "rtsp_transport": "tcp",
        # "buffer_size": "1024000",
    }
    # ****************************************************************
    # url:表示海康摄像头的地址
    # options:rtsp_transport表示采用什么传输方式,buffer_size表示缓冲大小
    # timeout:timeout=(10, 24)限制时间
    # ****************************************************************
    container = av.open(url,'r',options=options)
    print("format:" , container.dumps_format())

    # Signal that we only want to look at keyframes.
    stream = container.streams.video[0]
    stream.codec_context.skip_frame = 'NONKEY'

    for frame in container.decode(stream):
        client = ntplib.NTPClient()
        global response
        try:
            response = client.request('ntp.api.bz')
        except:
            pass
        ntp_time = datetime.datetime.fromtimestamp(response.tx_time)
        dt_ms = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')  # 含微秒的日期时间,来源 比特量化
        # ****************************************************************
        # 根据pts来计算一桢在整个视频中的时间位置:
        # 时间戳 = pts * (AVRational.num/AVRational.den) ,这里的pts是相对pts = 绝对PTS - 首帧PTS
        # timestamp(秒) = pts * av_q2d(st->time_base)
        # timestamp(毫秒) = pts * av_q2d(st->time_base) * 1000
        # pts= rtp 时间戳 *timebase
        # ****************************************************************
        second=frame.pts*frame.time_base
        rtp_time = frame.pts / frame.time_base
        print('ntp_time:{} pc_time:{} rtp_time:{} pts_time:{} dts_time:{}'.format(ntp_time,dt_ms,rtp_time,float(frame.pts),float(frame.dts)))

        # 我们使用frame.pts作为frame.Index '对' skip_frame '没有意义。
        # frame.to_image().save(
        #     'night-sky.{:04d}.jpg'.format(frame.pts),
        #     quality=80,
        # )
        img = frame.to_ndarray(format='bgr24')
        img = cv2.resize(img,(668,668))
        cv2.imshow("Test", img)
        cv2.waitKey(1)

实现效果

在这里插入图片描述

附录

目录
相关文章
|
2天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
4天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
581 22
|
4天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
11天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
580 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
7天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2