通过opencv读取摄像头,将每一帧图像写入管道中,再通过ffmpeg将图像推流至流媒体服务器
python进行推流的整体思路都参考了这篇文章https://blog.csdn.net/rainweic/article/details/94666527,
谢谢作者的分享。
因项目的需求,本人只是在这基础上进行一个小优化,其他基本无太大变动。
self.command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-f', 'flv',
'-rtbufsize', '1000M',
'-max_muxing_queue_size', '1',
'-bufsize', '1',
'-preset', 'veryfast',
'-crf', '22',
'-maxrate', '100k',
'-acodec', 'libmp3lame',
'-ac', '2',
'-ar', '44100',
'-b:a', '96k',
'-tune', 'zerolatency',
'-sc_threshold', '499',
'-profile', 'high',
self.rtmpUrl]
while True:
ret, frame = cap.read()
# 因为我这俩天遇到的项目里出现断流的毛病
# 特别是拉取rtmp流的时候!!!!
# break
if not ret:
print("Opening camera is failed")
cap.release()
# 说实话这里的break应该替换为:
print("Opening camera is reloading")
cap = cv.VideoCapture(self.camera_path)
count += 1
if count == 50:
break
continue
# put frame into queue
self.frame_queue.put(frame)
self.frame_queue.get() if self.frame_queue.qsize() > 1 else time.sleep(0.001)
在该系统中使用livego开源系统作为流媒体服务器,该系统语言有Go,代码可在GitHub上搜索livego,也可在通过以下链接点击进入https://github.com/gwuhaolin/livego
livego中可以通过livego.yaml文件修改配置,(批量添加服务无法得知),默认使用缓存,存储申请的channel_key和room。可以通过在yaml文件中添加以下配置,可使用redis缓存数据库。流媒体服务器的具体使用方法,可阅读readme.md文件。有能力的读者可深究代码,进行优化,与livego作者gwuhaolin联系,在此感谢系统作者的开源。但是用于生产环境,还需测试考虑。
livego支持hls,http-flv, rmtp 拉流播放,具体使用可参考readme.md文件
server:
- appname: live
live: true
hls: true
redis_addr:
redis_pwd: