视频推拉流 - python
最近在一个项目中,需要视频推流,最后成功完成,给大家分享一下
·
一,
最近的一个项目中,需要用python实现摄像头实时视频推流,代码写好后运行程序,始终会报错,说转码不对。
p.stdin.write(frame.tobytes()) 报错
后来查询大量资料,发现是因为pycharm环境下下载的ffmpeg包的版本太低,需要在conda环境下下载最新版本的ffmpeg
下面展示一下实现过程,方便大家学习。
1.首先打开我们的CMD
查询conda版本
conda --version
2.查看现有虚拟环境
conda info --envs
或者
conda env list
3.创建conda虚拟环境
conda create -name ceshi python=3.9
4.切换到ceshi的虚拟环境里面
conda activate ceshi
5.查看ceshi环境里面的库
conda list
下载opencv,和ffmpeg库(opencv库用的是pip)
pip install opencv-python
//ffmpeg库需要使用conda环境下载
conda install ffmpeg
二,工程代码
1.进入工程
2.
3.
4.推流代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/5/31 19:18
# @Author : LXL
# @File : tuiliu.py
import cv2
# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
import subprocess
# 视频读取对象
cap = cv2.VideoCapture(0)
# 读取一帧
ret, frame = cap.read()
# 推流地址
rtmp = "填写你自己的服务器地址"
# 推流参数
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', '640*480', # 根据输入视频尺寸填写
'-r', '15',
'-i', '-',
'-c:v', 'h264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmp]
# 创建、管理子进程
pipe = subprocess.Popen(command, stdin=subprocess.PIPE)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 循环读取
while cap.isOpened():
# 读取一帧
ret, frame = cap.read()
if frame is None:
print('read frame err!')
continue
# 显示一帧
cv2.imshow("frame", frame)
# 读取尺寸、推流
img = cv2.resize(frame, size)
pipe.stdin.write(img.tobytes())
cv2.waitKey(30)
# 关闭窗口
cv2.destroyAllWindows()
# 停止读取
cap.release()
5.拉流代码
import cv2
image_width = 320
image_height = 240
rtsp_latency = 10
url = "填写你自己的服务器地址"
cap = cv2.VideoCapture(url)
while True:
ret, frame = cap.read()
cv2.imshow("laliu", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
6.成果展示
更多推荐
所有评论(0)