硬件环境
软件环境
准备一个RTSP摄像头,本人淘宝买了一个4k的工业网络摄像头,一两百块,找一个合适的地方安装好,看我的
摄像头厂商有基本的代码跟工具管理摄像头,案例代码:
python# coding: utf8
import datetime
import os
import time
import cv2
class Camera:
def __init__(self, s):
self.cap = cv2.VideoCapture(s)
# camera_status = self.check_camera_status()
# if camera_status is False:
# print("摄像头不在线,获取失败!")
# return
# else:
# print("摄像头在线,应该没问题!!")
def check_camera_status(self):
if self.cap.isOpened():
return True
else:
return False
def save_camera_stream(self, output_dir):
print("开始存视频")
if not self.cap.isOpened():
print("无法连接到IP摄像机,请检查URL及网络连接。")
exit()
# 获取视频的基本信息
frame_width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_rate = self.cap.get(cv2.CAP_PROP_FPS)
if frame_rate <= 0:
frame_rate = 30 # 如果无法获取帧率,默认为 30
recording = False # 录制状态标志
record_timer = 0 # 录制计时器
codec = cv2.VideoWriter_fourcc(*"XVID") # 使用 XVID 编码器
video_writer = None # 视频写入对象
start_time = time.time() # 开始时间
while True: # 循环读帧
ret, frame = self.cap.read()
if not ret:
print("无法读取视频帧,请检查摄像头设备及连接。")
break
current_time = time.time() # 当前时间
# print(video_writer is None)
# print(current_time - start_time)
if video_writer is None or (current_time - start_time >= 300):
if video_writer is not None:
video_writer.release()
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
output_file = os.path.join(output_dir, f"video_{timestamp}.avi")
video_writer = cv2.VideoWriter(output_file, codec, frame_rate, (frame_width, frame_height))
start_time = current_time
video_writer.write(frame)
#
# recording = True # 开始录并且标记为记录状态
# record_timer = 0 # 开始录的时间
# video_filename = f"recording" + str(time.time_ns()) + ".avi"
# video_writer = cv2.VideoWriter(video_filename, cv2.VideoWriter_fourcc(*"XVID"), 25.0,
# (frame.shape[1], frame.shape[0]))
# print(f"开始录制视频:{video_filename}")
# # if not recording:
# # recording = True
# # record_timer = 0
# # video_filename = f"recording.avi"
# # video_writer = cv2.VideoWriter(video_filename, cv2.VideoWriter_fourcc(*"XVID"), 25.0, (frame.shape[1], frame.shape[0]))
# # print(f"开始录制视频:{video_filename}")
if __name__ == '__main__':
camera = Camera("rtsp://admin:Jing.jianqian@192.168.1.20:554/stream0")
camera.save_camera_stream('H://camera//')
以前是可以在B站开播的,后面改成1000粉丝才可以,因为我的账户没粉丝,所以需要哔哩哔哩直播姬工具,粉丝多的直接在B站管理后台开播后获取地址即可
直播姬配置 打开直播姬,添加素材,选择,
直播代码案例
提示
bilibili_url 是直播姬的信息,服务器加推流码,看图上我的地址rtmp://192.168.18.1:1935/livehime
代码OpenAi写的, 我改了改🙄
pythonimport cv2
import subprocess
# RTSP URL
rtsp_url = 'rtsp://admin:Jing.jianqian@192.168.1.20:554/stream0'
# B 站直播姬推流地址
bilibili_url = 'rtmp://192.168.18.1:1935/livehime'
# 使用 OpenCV 捕获 RTSP 视频流
cap = cv2.VideoCapture(rtsp_url)
# 获取视频流的宽度、高度和帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 使用 FFmpeg 推送视频流到 B 站
process = subprocess.Popen([
'ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', f'{width}x{height}', # 使用实际分辨率
'-r', str(fps), # 使用实际帧率
'-i', '-',
'-c:v', 'libx264',
'-preset', 'veryfast',
'-pix_fmt', 'yuv420p',
'-f', 'flv',
bilibili_url
], stdin=subprocess.PIPE)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
process.stdin.write(frame.tobytes())
cap.release()
process.stdin.close()
process.wait()
我的直播间:https://live.bilibili.com/31109555 欢迎也感谢帮我增加点人气😆
警告
警告 不知道为什么卡顿,有大佬知道的,非常感谢!!!!!😍🌹🌹🌹🌹
本文作者:Joker
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!