ffmpeg多路视频推流,分别接流(不合并)

本文详细介绍了在2022年如何使用ffmpeg进行多路视频推流,着重讨论了一路摄像头推多路接流和多路摄像头推多路接流的问题。在尝试过程中遇到实时缓冲区满导致的帧丢失错误,并分享了解决方案。通过Python脚本实现了多摄像头的独立推流,但面对大量摄像头时,速度可能成为挑战。同时,实验发现一个摄像头接出多路视频流时,后续路数的视频质量显著下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

真是想不明白,都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路

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如雾如电

随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值