ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

多路视频合成方案全解析:硬件分割器与软件拼接选型指南

多路视频合成方案全解析:硬件分割器与软件拼接选型指南 1. 需求拆解与整体方案选型先聊点实在的。最近好几个做项目和做产品的朋友都在问同一个问题现场装了几路甚至十几路摄像头主控端只有一个屏幕、一个上位机、一个存储通道怎么把这么多画面合成一路再甩给主控这个问题乍一看好像很简单做监控的人都懂但真正落地的时候坑深得很。先说清楚这个需求背后的真实场景。最常见的几类智能小车、机器人项目里前后左右装了多路摄像头主控只有一路视频输入接口。工业视觉检测工位多个工位各有一路相机但产线PLC或者上位机只预留了一个视频采集口。车载环视系统四个方向的摄像头画面要拼成一张全景鸟瞰图再给中控屏。移动端的安防监控箱多路USB摄像头要统一输出一路RTMP给后端平台。这些场景表面上是“画面合成”拆开之后其实涉及几个完全不同的技术路线。一个合格的工程师拿到需求第一件事不是打开代码编辑器而是先搞清楚你的合成是硬拼还是软拼要不要显示全部画面还是只要抽其中几路主控是哪一类设备这些问题直接决定方案选型。这里我给一个最核心的判断逻辑如果主控是单片机STM32、ESP32之类那就别指望软件合成必须走硬件方案如果主控是树莓派、Jetson、工控机这类带Linux系统的设备那就优先考虑软件合成如果对延迟极度敏感比如辅助驾驶、实时控制那无论哪类主控硬件方案都是更稳妥的选择。这个判断逻辑不是我拍脑袋定的而是由视频数据量和算力决定的。拿1080p分辨率来算单路不压缩的YUV422原始数据一帧大概是 1920×1080×2字节 ≈ 4MB25帧每秒就是100MB/s。两路就是200MB/s这个数据量对USB 2.0实际带宽约40MB/s来说直接爆掉对普通单片机的DMA和内存带宽也是灾难。所以“合成”这件事本质上是在和带宽、算力、延迟这三个约束做博弈。接下来我按适用场景把手上的成熟方案分成三大类分别展开。每一类我都会给出选型理由、核心原理、实操参数和踩坑记录方便你直接对照自己的项目抄作业。2. 硬件合成方案视频切换器、分割器与专用芯片硬件方案适合什么情况一句话主控性能弱或者对延迟零容忍。这类方案的核心思路是在摄像头和主控之间插一层硬件设备由它完成所有信号处理主控拿到的就是一路干干净净的合成信号全无感知。2.1 模拟信号时代的老办法硬件画面分割器如果你是做老式模拟监控出身的一定用过那种四画面、九画面、十六画面的分割器。这东西在数字高清普及之前是标配原理也简单粗暴多路模拟CVBS信号进去内置一块视频处理芯片把画面缩小后拼到一块再输出一路CVBS给显示器或者录像机。画质当然有损耗但胜在够用、够稳、够便宜。这套东西到现在还能用吗能用但只适用于模拟摄像头和低分辨率需求。现在市面上还能买到的模拟分割器基本上支持4路或8路输入输出PAL/NTSC格式分辨率也就D1704×576级别的水平。如果你要的是数字高清摄像头这条路就走不通了——HDMI和SDI的分配器不叫分割器叫多画面处理器价格翻了不止十倍。实操建议是除非你手上还有一堆旧的模拟摄像头和现成设备否则别碰这个方案。它的存在价值更多是理解视频合成的基础逻辑帮你建立“为什么不能直接多路接一路”的直觉。2.2 数字时代的硬件合成HDMI多画面处理器现在比较常见的项目场景是前端是支持HDMI输出的摄像头或者视频源比如NVR的HDMI口、电脑主机、采集盒主控端需要一路HDMI画面。这时候就轮到HDMI多画面处理器登场。这类设备的外形一般是一个小盒子和机架式设备背部有几个HDMI输入口和一个HDMI输出口前面板带按键可以切换单画面显示、多画面分割、画中画等模式。不同品牌功能差异很大贵的支持4K输入、无缝切换、音频混音便宜的只有基本的2×2四画面分割。我实测过一款中端的四路HDMI处理器简单说说感受输入4路HDMI最大分辨率1080p60输出1路HDMI分辨率可设置为1080p或4K输出模式单画面切换、2×2四画面、画中画支持边框颜色调节延迟体感小于一帧基本无感这个方案的优点是零开发、零代码接上就能用缺点也很明显——价格不便宜而且灵活性差。如果你需要把某一路画面放大、缩小、移动位置或者动态切换布局得靠遥控器或者按键一个个调完全没有编程接口。做项目的时候需要注意一个非常容易翻车的点HDMI处理器的输入路数是指物理输入口数量不是路数翻倍。四路处理器就只能接入四路画面你要接六路就得换八路设备预算也直接翻倍。所以硬件方案的扩展性要提前规划好别到现场才发现接口不够。2.3 适合嵌入式主控的FPGA硬件拼接方案这是硬件方案里最有做头、也最贴合“主控”这个词的方向。如果你的主控是FPGA、Zynq、或者带并行接口的高速单片机而且摄像头是多路MIPI、并行、或者LVDS接口那你完全可以考虑用FPGA来做视频拼接。FPGA拼接的核心流程是多路视频输入给到FPGA的硬核IO经过时序对齐、缩放、裁剪、坐标映射最后合成一帧输出给后级显示或编码单元。整个过程是纯硬件流水线不经过操作系统延迟可以做到极低通常在三毫秒以内。这里说一个实际案例。之前做一个环形视觉检测设备六个工位各有一路工业相机输出是六路并行RGB565信号主控是一块Zynq-7020带一路HDMI输出。需求是让操作员在显示器上同时看到六个工位的画面而且每路画面要叠加工位编号。当时我用的方案是在PL端写一个VDMA采集模块把六路视频输入缓存到DDR。在PL端做一个坐标映射拼接模块把六路缩放到1/3尺寸排成2行×3列的布局。拼接后的帧通过VDMA输出到HDMI控制器显示。工位编号叠加是额外写的一个OSD模块On-Screen Display在像素输出的时机插入字符点阵。实测下来六路1080p30输入合成一路1080p60输出PL资源占用大概用了LUT的六成左右延迟在三帧以内完全满足设备操作工位显示的需求。FPGA方案的优点是灵活性和性能上限极高缺点是开发周期长、调试难度大适合有硬件开发能力、项目量较大的团队。如果只是做一个验证原型或者说项目数量不大用FPGA反而是一种投入产出比很低的选择。2.4 硬件方案选型速查表为了方便你快速决策我整理了一张对比表方案类型适用主控典型设备/技术延迟开发量成本模拟画面分割器老式监控系统四路/九路/十六路分割器低零低HDMI多画面处理器带HDMI输入的主控四路/八路HDMI处理器低零中高FPGA硬件拼接FPGA/Zynq/高速单片机自定义拼接IP极低高高器件开发SDI多画面处理器广电/NVR广播级多画面器低零极高我的建议是如果不是做产品销售而是做项目交付优先考虑直接的HDMI处理器如果是做产品原型验证优先考虑软件方案后面会讲只有当量产规模足够大、性能要求确实卡死了软件方案的时候再狠下心来投入FPGA开发。3. 软件合成方案OpenCV、FFmpeg与GStreamer如果你的主控是树莓派、Jetson Nano、工控机这类有完整Linux系统的设备那软件合成是性价比最高的路线。开发量不算大灵活性高想怎么排布都行还能顺手叠加OSD、做编码推流。这类方案的核心思想是先把多路视频流解进来在内存里完成缩放和拼贴再编码输出。3.1 为什么软件合成更吃香软件合成最大的优势是生态成熟。OpenCV、FFmpeg、GStreamer这些库都是开源方案很多年历史踩坑的人多资料也就多。你遇到的绝大多数问题搜索引擎上几乎都能搜到现成的答案。软件合成另外一个优势是灵活。摄像头画面接入之后你在拼接之前可以任意做图像处理亮度均衡、畸形校正、裁剪、缩放、栏栅校正、AI检测框叠加这些操作在硬件分割器上基本不可能实现但在软件方案里只是多写几行代码的事。还有一个意想不到的优势软编解码能力可以复用主控的GPU硬件加速。现在的树莓派和Jetson都内置了VPU、GPUFFmpeg和GStreamer都可以调用硬件编码器做H.264/H.265编码把CPU从编码压力里解放出来。这个对多路合成的场景非常重要——因为合成之后的编码会因为分辨率变大编码压力比单路高很多没有硬件编码器CPU很容易跑到100%。3.2 用OpenCV做多路合成5分钟写出核心逻辑很多人一想到OpenCV就头疼但其实多路合成这件事的代码量非常小。核心就是capture resize hconcat/vconcat imshow说白了三步读图、缩放、拼接。我直接给一个最简单实用的例子四路画面合成2×2的布局import cv2 import numpy as np DEVICES [0, 1, 2, 3] WIDTH, HEIGHT 640, 360 caps [cv2.VideoCapture(i) for i in DEVICES] # 检查是否所有摄像头都成功打开 for i, cap in enumerate(caps): if not cap.isOpened(): print(fWarning: camera {DEVICES[i]} open failed) # 用黑帧占位避免后面报错 caps[i] None while True: frames [] for cap in caps: if cap is None: frame np.zeros((HEIGHT, WIDTH, 3), dtypenp.uint8) else: ret, frame cap.read() if not ret: frame np.zeros((HEIGHT, WIDTH, 3), dtypenp.uint8) else: frame cv2.resize(frame, (WIDTH, HEIGHT)) frames.append(frame) top np.hstack(frames[0:2]) bottom np.hstack(frames[2:4]) combined np.vstack([top, bottom]) cv2.imshow(Combined View, combined) key cv2.waitKey(1) 0xFF if key ord(q): break for cap in caps: if cap is not None: cap.release() cv2.destroyAllWindows()这段代码的核心逻辑就两行np.hstack做横向拼接np.vstack做纵向拼接。四路画面拉成640×360的分辨率横向拼两个再纵向拼两个最终输出一张1280×720的画面。这个代码跑通之后你想要的任意布局都可以通过组合这两个操作实现。注意几个容易踩的坑摄像头打开序号不一定是0、1、2、3。Linux下/dev/video*的分配可能和物理位置无关需要手动指定或者用v4l2-ctl --list-devices查看实际设备路径。cap.read()偶尔会返回False尤其是在USB带宽不足的时候所以必须有黑帧替代逻辑否则程序直接崩溃。不同摄像头的帧率可能不一致合成时会出现短暂的画面错位这个在代码层面很难完全消除只能尽量选同型号、同配置的摄像头。3.3 用FFmpeg做RTSP拉流合成稳定性和编码效率更优OpenCV方案适合本地摄像头直接接入但如果你的摄像头在网络上比如海康、大华、宇视这些IP摄像头那用IO方式直接读RTSP流就不现实了。更合理的做法是交给FFmpeg它可以同时处理拉流、解码、缩放、拼接、编码、推流一条龙。FFmpeg的多路合成有两个思路。第一个思路是用filter_complex滤镜图在命令层面直接完成拼接。假设我有两路RTSP流分别来自rtsp://192.168.1.64:554/stream1和rtsp://192.168.1.65:554/stream1要把它们左右并排合成一路输出ffmpeg -rtsp_transport tcp -i rtsp://admin:password192.168.1.64:554/Streaming/Channels/101 \ -rtsp_transport tcp -i rtsp://admin:password192.168.1.65:554/Streaming/Channels/101 \ -filter_complex [0:v]scale960:540[v0];[1:v]scale960:540[v1];[v0][v1]hstackinputs2:shortest1[vout] \ -map [vout] -c:v libx264 -preset veryfast -tune zerolatency -f flv rtmp://your-server/live/combined这条命令的意思是把两路RTSP流分别拉到960×540用hstack横向拼接输出1920×540的画面编码成H.264后以RTMP推流出去。同样的思路用vstack就是上下拼接四路就先用hstack拼两对再用vstack拼。这里我特别说一下为什么加-rtsp_transport tcp。RTSP协议默认走UDPUDP在弱网环境下丢包特别严重画面会出现花屏、绿屏、起条纹。有线局域网里UDP可能没事但Wi-Fi或者跨网段时一定要改成TCP。TCP方式会有一定的重传延迟略高但画面稳定对于监控类需求来说稳定性优先级永远是第一位。第二个思路是分段处理先用FFmpeg把每个RTSP流转成一张一帧的原始图像再用OpenCV做画面处理。这个思路适合你要做AI检测、图像增强等比较复杂算法的场景。具体实现是开多个FFmpeg子进程每路分别输出到stdout管道然后OpenCV从管道里按帧读取。这个方案的缺点是要自己管理子进程和帧同步复杂度比纯FFmpeg要高。3.4 用GStreamer做低延迟合成适合树莓派和JetsonGStreamer的优点是可以利用硬件加速延迟比FFmpeg低一截缺点是学习曲线陡元素element、垫pad、bin、pipeline这些概念新手很容易混淆。我简单给一个树莓派上两路USB摄像头合成的例子gst-launch-1.0 \ v4l2src device/dev/video0 ! video/x-raw,width640,height360,framerate30/1 ! videoconvert ! videoscale ! compositor namecomp \ sink_0::xpos0 sink_0::ypos0 \ sink_1::xpos640 sink_1::ypos0 \ ! videoconvert ! autovideosink \ v4l2src device/dev/video1 ! video/x-raw,width640,height360,framerate30/1 ! videoconvert ! videoscale ! comp.sink_1这里的compositor元素就是干拼接这件事的。它创建了一个画布然后每个sink对应一路视频源通过xpos和ypos参数指定位置。这个例子里第一路放在左上角0,0第二路放在右上角640,0画布总宽度1280高360。GStreamer的compositor还支持混合透明度甚至可以把背景视频嵌到蓝幕视频里做抠像功能非常强大。如果你需要动态布局也可以用Python的GStreamer绑定gi.repository中的Gst在运行时修改xpos/ypos实现画面位置实时调整。树莓派上跑这个pipeline要注意两点一是videoconvert和videoscale要放在进入compositor之前否则元素内部会自动插入转换元素性能会下降二是如果输出端接HDMI显示器autovideosink会自动选择硬件叠加层低负载、低延迟如果输出端要推流就把autovideosink换成rtmp2sink再串一个h264enc树莓派上是v4l2h264encJetson上是nvh264enc做硬件编码。4. 实操环节从采集、解码到合成推流的一次完整落地前面几节分别拆了硬件方案和软件方案这一节我用一个具体项目串起来讲讲完整落地过程中“合成”以外的细节。很多人以为多路合成最难的是拼图那一步实际上拼图只是其中最不值钱的一部分真正的硬骨头在采集、帧同步、时间戳、编码推流这些环节。4.1 摄像头选择与采集端配置以一套四路USB摄像头合成项目为例。主控我选的是一块Jetson Nano四路摄像头是淘宝上常见的无驱USB摄像头OV5640传感器分辨率最大支持1080p但USB2.0口实际带宽只能撑两路1080p所以我直接把采集分辨率调成了720p。这里给一个很有价值的经验多路USB摄像头别用1080p采集用720p或更低除非你有足够的理由。原因很简单USB总线上所有摄像头共享带宽4路1080p30加起来需要的带宽远超USB2.0的实际负载能力结果就是帧率掉到十几帧甚至个位数而且摄像头之间相互抢带宽频繁出现丢帧、花屏、设备掉线。如果项目必须要高分辨率采集优先考虑下面几个方案换USB3.0摄像头和USB3.0接口带宽提升到5Gbps实际可用约400MB/s四路1080p基本没问题。换MIPI CSI摄像头每个CSI口独占带宽互不干扰。树莓派有两个CSI口Jetson Nano有多个CSI口效率比USB高得多。换网络摄像头每个摄像头走自己的网口主控通过交换机接多路RTSP流理论上只要交换机带宽够路数几乎无限。采集分辨率决定之后再设置采集参数。Linux下用v4l2-ctl可以快速设置v4l2-ctl -d /dev/video0 --set-fmt-videowidth640,height360,pixelformatYUYV v4l2-ctl -d /dev/video0 --set-ctrl brightness128 v4l2-ctl -d /dev/video0 --set-ctrl exposure_auto1这些参数最好写死而不是依赖摄像头默认值不然每次插拔设备、重启系统后参数可能跳回默认画面亮度、对比度不稳定拼出来的图或者视频会出现明显的视觉割裂。4.2 帧同步的双缓冲与丢帧策略多路摄像头合成最大的技术难点不是拼接而是帧同步。每一路摄像头虽然显示都是25帧或者30帧但实际采到的时间点是错开的摄像头A的帧可能已经到第30帧了摄像头B才刚到第27帧。如果直接拿当前最新的帧去拼接会出现左右画面差两三帧的“错位感”尤其画面里有运动物体时看起来特别别扭。业界常用的策略是双缓冲加时间戳匹配。大致流程是为每一路输入设立一个单元素队列摄像头采集线程把每一帧的打上时间戳后丢进队列。合程线程每一轮先确定一个基准时间戳取最早到达的那一路的最新帧的时间戳。其他各路在各自队列里找最接近基准时间戳的帧丢弃更旧的帧用这个帧参与拼接。代码层面可以用collections.deque实现队列配合一个简单的超时逻辑import collections import time BUFFER_SIZE 5 frame_buffers [collections.deque(maxlenBUFFER_SIZE) for _ in range(4)] def add_frame(cam_id, frame, ts): frame_buffers[cam_id].append((ts, frame)) def get_synced_frames(): # 基准时间戳取各路最新帧时间戳的最小值 base_ts min(buf[-1][0] for buf in frame_buffers if len(buf) 0) synced [] for buf in frame_buffers: # 从旧到新找第一个大于等于base_ts的帧 chosen None for ts, frame in buf: if ts base_ts: chosen frame break if chosen is None: chosen buf[-1][1] # 兜底取最新帧 synced.append(chosen) return synced这个策略不是严格的等时同步但足够把各路画面的时间差压缩到一两帧以内人眼基本感受不到。如果你的场景对帧同步要求极高比如双目测距、立体视觉那就不能用这种软件近似法得上硬件级别的同步信号Genlock、External Trigger或者用支持帧同步的工业相机。4.3 OSD叠加主控需要的可读信息画面拼好了很多需求还要叠加信息比如路号、时间戳、分辨率、GPS坐标、AI检测框。OSD叠加的原理是在像素层面做alpha混合把文字或图形渲染到一张透明图层上再和视频帧按比例混合。OpenCV里叠加文字最常见的方式是cv2.putText但要注意两点一是中文字体支持很差默认的cv2.FONT_HERSHEY_SIMPLEX不支持中文需要额外用Pillow画中文二是每帧调用putText会有性能损耗如果画面是1080p60可以考虑把OSD层预先渲染好拼接时直接叠加省去每帧的文字渲染开销。ffmpeg里叠加OSD更高效用drawtext滤镜就可以ffmpeg -i input.mp4 -vf drawtexttextCAM 01:x10:y10:fontsize24:fontcolorwhite:box1:boxcolorblack0.5:boxborderw5 output.mp4在拼接命令里把drawtext加在hstack之后即可。这样输出的合成画面里每一路已经带上了通道名主控端一眼就能认出是哪一路摄像头。4.4 编码与推流合成之后怎么送给主控画面合成完之后要给到主控端通常有几种出口显示到本机屏幕上用imshow或者autovideosink。编码成文件存储用H.264/H.265输出MP4。通过RTSP/RTMP推流到远程主控或平台。推流这个环节很多项目翻车都翻在码率设置上。合成画面的分辨率是单路画面的几倍如果码率还是按单路1080p的水平设画质一定糊。一个粗略的码率参考公式推荐码率(Mbps) ≈ 1.5 × 分辨率百万像素 × 帧率 / 30举个例子四路720p拼成1440×720分辨率约100万像素30帧按公式算需要约5Mbps的码率才不会太糊。如果主控端网络带宽有限降码率可以接受但不要低于3Mbps否则画面文字和边缘会出现严重的压缩伪影。Jetson上推流建议用硬件编码器ffmpeg -i rtmp://your-server/live/input -c:v h264_nvv4l2 -preset p1 -tune ll -b:v 5M -f flv rtmp://your-server/live/combinedh264_nvv4l2是Jetson平台专有的硬件编码器preset p1是低延迟配置tune ll打开低延迟模式。普通CPU平台可以换h264_vaapiIntel核显或者h264_qsvIntel Quick Sync。5. 踩坑实录多路合成项目里我最常遇见的几个问题这一节把我在实际项目里踩过的一些坑整理成速查表每一个都是真金白银换来的教训文字描述对应“如果你碰到了这个问题该怎么排查”。现象可能原因排查方法解决方案某路画面花屏或绿屏USB带宽不足、RTSP用UDP拉流丢包v4l2-ctl --all 查看设备状态播放该路单独RTSP流确认降分辨率/帧率RTSP强制TCP换USB3.0拼接画面明显错位摄像头帧到达时间不一致打印各帧时间戳对比差值引入双缓冲帧同步策略固定采集参数合成画面卡顿但CPU没满GPU编码器没启用走了CPU软编top看ffmpeg线程CPU占用率换硬件编码器h264_v4l2m2m等某路摄像头反复掉线USB供电不足、挑线材dmesg 查看 USB disconnect 日志换带供电的USB HUB换优质USB线降负载主控显示端延迟高拉流端和推流端都用了缓冲测试本地延迟逐个段落定位减小缓冲队列开启 zerolatency 模式多路画面亮度不一致摄像头自动曝光/白平衡参数不一致拍摄同场景对比全部固定曝光、固定白平衡opencv合成时内存暴涨imshow窗口和摄像头对象忘记释放查看进程内存曲线用with语句保证释放或设置缓冲上限5.1 USB供电不足这个隐形杀手四路USB摄像头合成项目中掉线问题十有八九是供电问题而不是协议问题。USB摄像头单路工作电流大约在200mA~500mA之间四路加起来需要的电流很容易超过主板单个USB控制器的供电能力。这种情况下摄像头会间歇性掉线——表现为画面长时间黑屏dmesg日志里反复出现USB disconnect, device number X。排查方法就是用dmesg -w实时监控内核日志如果在掉线的瞬间出现USB disconnect记录说明供电或者线材有问题。解决办法是加一个带独立电源的USB HUB每路摄像头插一个口HUB接12V/2A以上电源适配器。实测下来这一招解决了90%的USB掉线问题。还有个隐藏坑便宜的USB HUB虽然标称带电源但内部线路共用实际供电能力还是不够最好选工业级或者拆开看供电走线。5.2 树莓派采集CSI摄像头时MIPI链路不稳定树莓派上用CSI摄像头做多路合成最常见的问题是MIPI链路不稳定。表现为开机第一分钟正常之后随机花屏或者整路黑屏。这个和硬件布线、电源纹波、摄像头排线长度都有关系。实操经验是排线越短越好超过15cm就很容易出问题CSI排线一定要插紧接口侧要听到卡扣声很多隐蔽的花屏就是排线松动导致的另外树莓派的5V供电质量对MIPI稳定性影响非常大遇到花屏先换个可靠的5V/3A电源再考虑换排线、换摄像头。5.3 时间戳漂移导致的双目同步误差双目测距或者立体视觉场景对两路画面的时间同步要求极高。如果是用USB摄像头由于USB总线抢占两路摄像头真正曝光时刻永远不可能完全一致时间戳也可能出现漂移。这个问题的本质是系统时钟和摄像头曝光时刻没有硬件级对齐。解决思路有两种。预算允许的情况下直接换支持硬件触发同步的工业相机用一条触发线同时触发所有相机的曝光。预算有限的情况下可以做一个软件校正先测量两路画面的延迟差然后在帧同步时引入这个离线校正量。这个校正量会随温度和系统负载漂移所以只能算是一种妥协方案不是根治办法。6. 方案选型决策树与最终建议写到这里我把整个选型逻辑浓缩成一张决策树方便你对着项目情况直接定位。判断顺序主控是否带完整操作系统Linux/Windows否走硬件分割器或FPGA方案。是继续下一步。摄像头是本地USB/MIPI还是网络RTSP本地USB/MIPI且路数少≤4路直接用OpenCV/GStreamer。网络RTSP直接用FFmpeg/GStreamer拉流合成。画面需要实时性延迟100ms还是可接受1~2秒延迟实时性要求高上GStreamer可以用硬件加速或FPGA。实时性要求一般FFmpegTCP拉流即可最简单。合成后是否需要再做AI算法处理需要建议每路先解码成原始帧算法处理后再拼接输出。不需要直接用FFmpeg的filter_complex一条命令搞定。主控是否已经有现成的显示或推流链路有合成输出端直接对接现有链路。没有需要自己搭一套RTSP推流服务如mediamtx、ZLMediaKit。按照这个决策树走下来六成场景会落到FFmpeg或GStreamer的软件方案上三成会落到FPGA或硬件分割器剩下的会涉及混合方案。这里再补充一句个人经验如果项目周期短、人手缺能买现成硬件就不要自己开发如果要做产品、要量产再狠下心来啃FPGA也不迟。最后说一个我个人的小心得。多路合成这件事表面上是一个视频技术问题但实际做下来会发现它更像一个系统工程。摄像头选型、供电、带宽规划、帧同步、OSD、编码、推流、主控协议每一个环节都是木桶的一块板最短的那块决定整个项目的交付质量。与其问“哪个方案最牛”不如先问“我的主控到底能接受什么”。这比任何技术选型都更重要。如果你准备动手做这个项目我建议先做一个最小可行原型两路摄像头合成到一台Linux主控用FFmpeg推流验证一遍链路再逐步加路数。把最简单的链路跑通之后再处理帧同步和稳定性这些进阶问题整个项目的推进节奏会顺利很多。
返回列表