相关文章推荐
爱看球的牙膏  ·  IDEA ...·  8 月前    · 
微醺的开水瓶  ·  Python ...·  1 年前    · 
爱听歌的领带  ·  编译器错误 C2871 | ...·  1 年前    · 
精彩文章免费看

python-opencv基于ffmpeg实现rtsp推流

代码

import cv2
import subprocess
'''拉流url地址,指定 从哪拉流'''
# video_capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 自己摄像头
pull_url = 'rtsp://192.168.107.189/stream1' # "rtsp_address"
video_capture = cv2.VideoCapture(pull_url) # 调用摄像头的rtsp协议流
# pull_url = "rtmp_address"
'''推流url地址,指定 用opencv把各种处理后的流(视频帧) 推到 哪里'''
push_url = "rtsp://192.168.107.65:8554/room55"
width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(video_capture.get(cv2.CAP_PROP_FPS)) # Error setting option framerate to value 0. 
print("width", width, "height", height,  "fps:", fps) 
# command = [r'D:\Softwares\ffmpeg-5.1-full_build\bin\ffmpeg.exe', # windows要指定ffmpeg地址
command = ['ffmpeg', # linux不用指定
    '-y', '-an',
    '-f', 'rawvideo',
    '-vcodec','rawvideo',
    '-pix_fmt', 'bgr24', #像素格式
    '-s', "{}x{}".format(width, height),
    '-r', str(fps), # 自己的摄像头的fps是0,若用自己的notebook摄像头,设置为15、20、25都可。 
    '-i', '-',
    '-c:v', 'libx264',  # 视频编码方式
    '-pix_fmt', 'yuv420p',
    '-preset', 'ultrafast',
    '-f', 'rtsp', #  flv rtsp
    '-rtsp_transport', 'tcp',  # 使用TCP推流,linux中一定要有这行
    push_url] # rtsp rtmp  
pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE)
def frame_handler(frame):
    return frame
process_this_frame = True 
while True: # True or video_capture.isOpened():
    # Grab a single frame of video
    ret, frame = video_capture.read()
    # handle the video capture frame
    start = time.time()
    frame = frame_handler(frame) 
    # Display the resulting image. linux 需要注释该行代码
    # cv2.imshow('Video', frame)
    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(delay=100) & 0xFF == ord('q'): #  delay=100ms为0.1s .若dealy时间太长,比如1000ms,则无法成功推流!
        break
    pipe.stdin.write(frame.tostring())
    # pipe.stdin.write(frame.tobytes())
video_capture.release()
cv2.destroyAllWindows()
pipe.terminate()