真是想不明白,都2022了,网上有关多路推流和接流的文章居然这么少!大部分都是多路视频流合并成一路,真是无语。下面我把探索的过程给出来让大家参考下
首先说明下,我有两个usb摄像头,在项目里肯定是网络摄像头,其实差别不是很大,举一反三应该能解决问题
1.一路摄像头推出,多路接流
ffmpeg -f dshow -i video="HIK 1080P Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1 -f flv rtmp://192.168.41.132/live/test2
2.多路摄像头推出,多路接流
ffmpeg -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
两路同时推报错:real-time buffer [HIK 1080P Camera] [video input] too full or near too full (100% of size: 3041280 [rtbufsize parameter])! frame dropped!
原因是编码的速度太慢导致过多的图片数据保存在缓存内,缓存区空间太小或满了就会报错
同样的下面几种情况也会报错,改变了缓存大小,图像大小都不行,说明两路同时在一起推是不行的
ffmpeg -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtbufsize 2048M -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
ffmpeg -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -bufsize 2048M -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
ffmpeg -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -s 300*300 -framerate 15 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
ffmpeg -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -framerate 15 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -preset veryfast -crf 22 -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -f dshow -i video="HIK 1080P Camera" -f dshow -i video="PC Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.41.132/live/test0 -f flv rtmp://192.168.41.132/live/test1
实践证明,分别打开两个命令行窗口分别运行两条命令是可以的,但是这明显不能满足要求,注意下面的速度,两个的时候有一个明显速度很慢。
那我实际做项目不可能手动打开两个命令行窗口,这时候该怎么办呢,只能用脚本实现了,下面是我参考了网上很多代码,稍微改了下,实现两个或者多个usb摄像头推流
import os
import time
import queue
import threading
import cv2
# import subprocess as sp
from subprocess import Popen, PIPE, STDOUT
class Live(object):
def __init__(self, url, cam):
self.frame_queue = queue.Queue()
self.command = ""
self.rtmpUrl = url
self.cam = cam
def read_frame(self):
# ffmpeg command
self.command = ['ffmpeg',
'-f', 'dshow',
'-i', 'video='+self.cam,
'-vcodec', 'libx264',
'-preset:v', 'ultrafast',
'-tune:v', 'zerolatency',
'-f', 'flv',
self.rtmpUrl]
self.command = ' '.join(self.command)
def push_frame(self):
while True:
if len(self.command) > 0:
print(self.command)
# p = sp.Popen(self.command, shell=True, stdin=sp.PIPE)
# p = Popen(["cmd"], shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
# outs, errs = p.communicate(self.command)
p = os.system(self.command)
break
def run(self):
threads = [
threading.Thread(target=Live.read_frame, args=(self,)),
threading.Thread(target=Live.push_frame, args=(self,))
]
for thread in threads:
thread.setDaemon(True)
thread.start()
if __name__ == "__main__":
cams = ['"HIK 1080P Camera"', '"PC Camera"']
for i in range(len(cams)):
url = "rtmp://192.168.41.132/live/test"+str(i)
demo = Live(url, cams[i])
demo.run()
注意我这里用了os.system执行了命令行命令,Popen一直没起作用,暂时先放着,运行脚本以后,发现速度还是这样的,说明分开用两个命令行窗口单独运行两个命令和这个脚本的效果是一样的,脚本没问题
我已经用python代码分别接了两个摄像头的视频流,至少两个的时候不卡顿
现在问题又来了,假如我有几百个摄像头该怎么办?这速度有可能会降到无法接受的程度,大家懂的欢迎一起探讨。
3.其它探索
一个摄像头同时接出来10路视频流时,第一路正常,后面几路路很模糊了
第1路
第3路
第6路
第10路