当前位置: 首页 > 工具软件 > livego > 使用案例 >

基于ffmpeg+python-opencv+livego的直播服务(无音频,仅图像)

姜明贤
2023-12-01

推流方法

python-opencv, ffmpeg

通过opencv读取摄像头,将每一帧图像写入管道中,再通过ffmpeg将图像推流至流媒体服务器
python进行推流的整体思路都参考了这篇文章https://blog.csdn.net/rainweic/article/details/94666527
谢谢作者的分享。
因项目的需求,本人只是在这基础上进行一个小优化,其他基本无太大变动。

  1. Demo的ffmpeg的参数延迟较高(也可能是本人电脑或者其他因素,无法获知),参数的优化也来源于QQ技术交流群和一些文章,在此一并感谢。如有更好的参数优化,请务必评论,感谢。
 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]
  1. 摄像头重连机制
 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_keyroom。可以通过在yaml文件中添加以下配置,可使用redis缓存数据库。流媒体服务器的具体使用方法,可阅读readme.md文件。有能力的读者可深究代码,进行优化,与livego作者gwuhaolin联系,在此感谢系统作者的开源。但是用于生产环境,还需测试考虑。
livego支持hls,http-flv, rmtp 拉流播放,具体使用可参考readme.md文件

server:
- appname: live
  live: true
  hls: true
redis_addr: 
redis_pwd:

该文章若有侵权,联系即删


 类似资料: