当前位置:   article > 正文

[python] ffmpeg-python读取rtsp(tcp方式)_ffmpeg-python rtsp 截取

ffmpeg-python rtsp 截取

[python] ffmpeg-python读取rtsp(tcp方式)

问题描述

在多路无线摄像头同时接入时,网络不稳定,经常出现雪花屏的问题。参考网上资料,怀疑是网络摄像头默认使用RTSP协议,RTSP下层默认使用UDP传输,而UDP传输是不可靠的,会丢包,所以导致雪花屏。

RTSP使用TCP或者UDP传输,使用TCP还是UDP取决于客户端的SETUP请求。所以尝试将由UDP改为TCP取流。

opencv-python的videocapture获取rtsp只支持UDP方式,改为用FFmpeg-python以tcp方式获取流

两种库和方式取流的速度、延迟和稳定性还待测试

FFmpeg-python

安装

pip install ffmpeg-python
  • 1

ffmpeg学习资源

代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import ffmpeg
import numpy as np
import cv2

camera = 'rtsp://admin:1234abcd@192.168.1.64/h264/ch1/main/av_stream'

probe = ffmpeg.probe(camera)
video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
width = int(video_stream['width'])
height = int(video_stream['height'])

out = (
    ffmpeg
        .input(camera, rtsp_transport='tcp')
        .output('pipe:', format='rawvideo', pix_fmt='bgr24', loglevel="quiet", r=25)
        .run_async(pipe_stdout=True)
)
cnt_empty = 0
while True:
    in_bytes = out.stdout.read(height * width * 3)
    if not in_bytes:
        cnt_empty += 1
        if cnt_empty > 10:
            break
    cnt_empty = 0
    frame = np.frombuffer(in_bytes, dtype=np.uint8).reshape(height, width, 3)
    # to process frame
    cv2.imshow('test', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

参考

解决摄像头花屏问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/738724
推荐阅读
相关标签
  

闽ICP备14008679号