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)

实现效果

在这里插入图片描述

附录

目录
相关文章
|
3月前
|
Linux 计算机视觉 C++
【解决方案】Building wheel for opencv-python:安装卡顿的原因与解决方案
当你安装OpenCV时,命令行停在Building wheel for opencv-python (PEP 517) ... -似乎卡住了。这并非程序假死,而是其编译耗时巨大。本文将揭示原因,并提供优化安装体验的实用方法。
483 88
|
13天前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
188 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
3月前
|
人工智能 数据挖掘 Linux
Centos安装Python3.7(亲测可用)
本指南详细介绍了在基于Linux(以CentOS系统为例,使用yum包管理器)的系统上安装Python 3.7版本的完整流程。Python是一种广泛使用的高级编程语言,在各种领域如软件开发、数据分析、人工智能和区块链开发等都有着重要的应用。
323 2
|
3月前
|
人工智能 Python
python基本数据类型简介
本文简要介绍了Python的基本数据类型,包括整型、浮点型、字符串、列表、字典和布尔类型,帮助读者对Python数据类型有初步了解。
118 0
|
6月前
|
IDE 开发工具 开发者
手把手教你安装PyCharm 2025:开发者的Python IDE配置全流程+避坑指南
本教程详细介绍了PyCharm 2025版本在Windows系统下的安装流程及配置方法,涵盖AI代码补全与智能调试工具链等新功能。内容包括系统要求、安装步骤、首次运行配置(如主题选择与插件安装)、创建首个Python项目,以及常见问题解决方法。此外,还提供了切换中文界面和延伸学习资源的指导,帮助用户快速上手并高效使用PyCharm进行开发。
3036 61
|
6月前
|
存储 缓存 文件存储
uv安装python及其依赖的加速方法
国内在使用uv的时候,可能会涉及到装python的速度太慢的问题,为了解决这个问题,可以使用`UV_PYTHON_INSTALL_MIRROR`这个环境变量。除此以外,对于多人协作场景,`UV_CACHE_DIR`也是一个有用的环境变量。本文会介绍这两个变量。
4439 10
|
7月前
|
人工智能 监控 算法
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
440 5
|
9月前
|
IDE 测试技术 项目管理
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
PyCharm是由JetBrains开发的Python集成开发环境(IDE),专为Python开发者设计,支持Web开发、调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制等功能。它有专业版、教育版和社区版三个版本,其中社区版免费且适合个人和小型团队使用,包含基本的Python开发功能。安装PyCharm前需先安装Python解释器,并配置环境变量。通过简单的步骤即可在PyCharm中创建并运行Python项目,如输出“Hello World”。
3137 13
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
|
8月前
|
JSON Shell 数据格式
使用 pipx 安装并执行 Python 应用程序 (1)
使用 pipx 安装并执行 Python 应用程序 (1)
751 17
|
7月前
|
数据采集 运维 Java
课时13:Python简介
今天我们分享的是 Python 的简单介绍,主要分为以下四部分。 1. Python 的百科介绍 2. Python 的发明者 3. Python 的发展历史 4. Python 的用途
135 1

热门文章

最新文章

推荐镜像

更多