背景
摄像头 rtsp 流作为输入,经过目标追踪等处理,保存为 flv 文件,web 端想进行文件的实时查看
技术方案
之前的工作已经保存了 flv 文件,前两天一直想的是将实时的 flv 文件进行推流到 nginx,这既要开启追踪、又要推流,涉及到多线程的东西,有没有更简便的方式呢?
有的,不保存为 flv 了,直接处理完一帧就推流一帧
单张图像推流代码
下面的代码中,rtmpUrl 是推流到的地址, 根据 nginx 的配置自行修改;-s 是图像的宽高,-r 是帧率,根据实际情况修改。
rtmpUrl = 'rtmp://localhost:1935/live/test'
command = ['ffmpeg',
'-y',
'-c', 'copy',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-pix_fmt', 'bgr24',
'-max_delay', str(100),
'-s', f'{int(width)}x{int(height)}',
'-r', str(15),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
'-g', '5',
'-b', '7000000',
rtmpUrl]
pushPip = subprocess.Popen(command, stdin=subprocess.PIPE, shell=False)
调用 pushPip.stdin.write(xxx) 向管道写入图像,完成推流,下载 flv.min.js,即可通过 html web 页面访问拉流地址,获取实时画面
推流的时候报 Input/output error 错误
经过排查,是 nginx 服务器没有正常运行,在上一篇文章我通过两种方法安装了 nginx,但是第一种方法安装后开启的 nginx 进程还没有杀掉,通过下面的命令,查找 nginx 相关进程,并强制杀掉,然后再启动 nginx,直到访问 nginx ip 能够显示 welcome to nginx 页面即可正常推流。
linux 相关命令
- 启动 nginx
sudo nginx - 查找 nginx 进程
ps -ef|grep nginx - 按进程号强制杀掉进程
kill -9 xxx