# RK RV1126平台(Buildroot Linux)+ SunplusIT SPCA2688 USB摄像头 RTSP推流全流程复盘与问题解决记录

一、平台与需求

- **硬件平台**:Rockchip RV1126
- **操作系统**:基于Buildroot定制的Linux系统
- **USB摄像头**:SunplusIT(凌阳创新)SPCA2688
- **目标**:用USB摄像头采集视频,在开发板本地搭建RTSP服务器,推流到`rtsp://开发板IP:端口/live/main_stream`,用VLC等播放器实时观看。
- **要求**:一键运行,兼容性好,画面流畅,适合嵌入式环境。

---

二、操作流程与问题排查(按时间先后)

1. 插入USB摄像头,识别设备节点

- **操作**:插入SunplusIT SPCA2688 USB摄像头,系统自动生成多个`/dev/video*`节点。
- **现象**:插入后出现了`/dev/video45`和`/dev/video46`。
- **问题1**:不清楚哪个节点是摄像头主视频流,哪个是辅助或元数据流。
- **排查**:
- 拔插摄像头前后对比`ls /dev/video*`,找出新增节点。
- 用`v4l2-ctl --device=/dev/video45 --all`和`v4l2-ctl --device=/dev/video46 --all`查看详细信息。
- **结论**:
- `/dev/video45`为主视频流(支持Video Capture),
- `/dev/video46`为元数据流(只支持Metadata Capture,不支持视频采集)。

#### 相关报错:
- 执行`v4l2-ctl --device=/dev/video46 --stream-mmap --stream-count=1 --stream-to=test_video46.raw`报错:
> unsupported stream type
原因:video46不支持视频采集,只能采集元数据。
解决:后续所有采集、推流操作都用`/dev/video45`。

2. 内核驱动与设备树适配流程(补充说明)

- **内核配置**:
- RV1126平台Linux内核需启用`CONFIG_USB_VIDEO_CLASS`(UVC驱动)、USB Host支持。
- Buildroot配置时,确保`v4l-utils`、`ffmpeg`等工具链集成。
- **设备树配置**:
- USB摄像头无需专门节点,只需USB Host控制器在设备树中`status = "okay"`。
- 典型片段:
```dts
&usb_host0 {
status = "okay";

```
- **驱动识别**:
- 插入摄像头后,内核自动加载`uvcvideo`驱动。
- `dmesg`日志会显示摄像头厂商、型号(如`SunplusIT SPCA2688`),并生成`/dev/video*`节点。
- **实际体验**:
- 本次SPCA2688插上即用,无需额外适配,体现了UVC类摄像头的良好兼容性。

---

3. 本地采集与录制测试

- **操作**:用`ffmpeg`采集摄像头数据并录制本地视频。
- **命令**:
```bash
v4l2-ctl --device=/dev/video45 --set-fmt-video=pixelformat=MJPG,width=640,height=480
ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i /dev/video45 -t 10 -c:v copy test_local.mp4
```
- **现象**:录制的视频用VLC播放正常,无绿屏。

#### 相关报错:
- 如果直接用YUYV格式录制为mp4:
> Could not find tag for codec rawvideo in stream #0, codec not currently supported in container
原因:YUYV是原始视频格式,mp4容器不支持原始rawvideo,需要转码或用支持的容器(如avi、mkv),或直接采集MJPEG。
解决:
- 采集MJPEG格式并直接copy到mp4容器。
- 或用`-c:v libx264`转码为H264。

---

4. 本地RTSP服务器搭建与推流

- **操作**:下载并运行mediaMTX(原rtsp-simple-server)作为本地RTSP服务器。
- **命令**:
```bash
./mediamtx &
```
- **现象**:日志显示:
> [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)

#### 相关报错:
- 日志中出现:
> ERR listen tcp :1935: bind: address already in use
> [RTSP] listener is closing
原因:mediamtx配置文件中RTMP端口(1935)被占用,导致服务异常退出,RTSP服务也随之关闭。
- **排查**:
- 检查`mediamtx.yml`配置文件,发现`rtmp: enabled: yes`。
解决:
- 编辑`mediamtx.yml`,将`rtmp: enabled: yes`改为`no`,只启用RTSP服务。
- 重新启动mediamtx,确认进程常驻且日志无关闭提示。

5. ffmpeg推流到本地RTSP服务器

- **操作**:用ffmpeg将摄像头采集的视频流推送到本地RTSP服务器。
- **命令**:
```bash
ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i /dev/video45 -c:v copy -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:8554/live/main_stream
```
- **现象**:ffmpeg推流无报错,VLC可以连接RTSP流。
- **问题**:VLC播放时大部分画面绿色,只有顶部一小部分正常。


- **排查**:
- 使用和相同的分辨率和帧率,本地录制后保存到mp4文件,然后使用VLC播放,画面正常无绿屏。但是推流过去用VLC查看就绿屏,说明MJPEG over RTSP兼容性差,推流到VLC那边的时候,画面数据已经不完整了,丢失了。

- 尝试降低分辨率、帧率,问题依旧。

原因:

  • 摄像头输出的MJPEG流有丢包、截断、帧尾丢失等问题,导致解码器(VLC)无法正确还原整帧,未解码部分用绿色填充。
  • VLC对某些MJPEG流的容错性较差,遇到帧头/帧尾异常就会绿屏

解决:
- 用ffmpeg将MJPEG流转码为H264后再推流,命令如下:
ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i /dev/video45 \
-c:v libx264 -preset ultrafast -tune zerolatency \
-f rtsp -rtsp_transport tcp rtsp://127.0.0.1:8554/live/main_stream

命令解释:

  • 前半部分:-f v4l2 ... -i /dev/video45
  • 让ffmpeg从USB摄像头采集视频流,格式为MJPEG,分辨率640x480,帧率15fps。
  • 中间部分:-c:v libx264 -preset ultrafast -tune zerolatency
  • 让ffmpeg用x264软件编码器,把采集到的MJPEG视频流转码为H264格式。
  • 后半部分:-f rtsp ... rtsp://127.0.0.1:8554/live/main_stream
  • 把编码好的H264视频流通过RTSP协议推送到本地RTSP服务器

使用上面这条命令推流,然后使用VLC播放H264 over RTSP流,画面正常,无绿屏,它的原理是

ffmpeg采集摄像头数据YUYV(原始未压缩)或者MJPEG(压缩)格式 → 编码为H264(依赖libx264软件编码器) → 通过RTSP协议推流到服务器(mediamtx) → VLC通过RTSP拉流 → VLC软件内置工具解码H264 → 显示画面

6. 其他常见问题与排查

- **mediamtx下载慢或失败**:用ghproxy等国内加速服务下载,或手动下载后拷贝到开发板。
- **VLC播放卡顿或无画面**:降低分辨率/帧率,确保网络和USB带宽充足。
- **推流地址错误**:推流时用`127.0.0.1:8554`,播放时用开发板实际IP。

最终实现正常推流画面:

 三、经验总结与最佳实践

1. **平台适配**:RV1126+Buildroot+SPCA2688方案,UVC摄像头即插即用,内核和设备树配置简单。
2. **设备节点识别**:插拔前后对比,结合`v4l2-ctl --all`确认主视频流节点。
3. **本地录制优先**:先本地录制,确认采集和编码无误,再推流。
4. **RTSP服务配置**:只启用RTSP,避免端口冲突导致服务退出。
5. **推流格式选择**:MJPEG over RTSP兼容性差,H264 over RTSP兼容性好,推荐转码推流。
6. **分步排查**:每一步都要验证,遇到问题逐步定位到设备、采集、推流、协议、播放器等环节。
7. **善用工具**:v4l2-ctl、ffmpeg、mediamtx、VLC等开源工具极大简化开发和调试。

四、推荐一键推流脚本(H264 over RTSP)

bash
#!/bin/bash
# 设置摄像头为MJPEG格式
v4l2-ctl --device=/dev/video45 --set-fmt-video=pixelformat=MJPG,width=640,height=480
# 启动mediamtx(如未启动)
if ! pgrep -f mediamtx > /dev/null; then./mediamtx &sleep 2
fi
# 推流为H264
ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i /dev/video45 \
-c:v libx264 -preset ultrafast -tune zerolatency \
-f rtsp -rtsp_transport tcp rtsp://127.0.0.1:8554/live/main_stream


五、结语

本次在RV1126平台(Buildroot Linux)+ SunplusIT SPCA2688 USB摄像头环境下实现RTSP推流,虽然中间遇到了一些设备节点识别、推流兼容性、服务端口冲突等问题,但通过分步排查和合理选型,最终实现了即插即用、稳定流畅的推流效果。此博客用来记录和复盘,后续可能还会在rv1126上适配多路摄像头,会再加个索尼imx415,如果后续有更多需求,如音视频同步、云端推流等高级功能,可在此基础上扩展。遇到新问题,建议先本地录制排查源头,再逐步定位到推流、协议、播放器等环节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88421.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88421.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88421.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Java虚拟机:Java内存区域与内存溢出异常

前言Java虚拟机(JVM)的自动内存管理是其核心特性之一,它极大地简化了开发者的工作,减少了内存泄漏和内存溢出的问题。本文将详细介绍JVM的自动内存管理机制的内存区域与内存溢出异常问题,包括运行时数据区域、对象的创…

位图入门算法191. 位1的个数

题目链接: 191. 位1的个数 - 力扣(LeetCode) 这道题让我们找出一个数字中二进制中1的个数,这个题目我们就用1的&来解决,最后一位有0为0,都是1才是1,我们只需要判断32次即可。 代码如下&am…

[架构之美]虚拟机Ubuntu密码重置

[架构之美]虚拟机Ubuntu密码重置 当您在虚拟机中运行Ubuntu系统时,忘记密码不再意味着数据丢失!本文将详细介绍可靠的密码重置方法,帮助您快速恢复系统访问权限。 一、虚拟机密码重置原理与准备 1.1 为什么虚拟机重置密码更容易 在虚拟机环…

kotlin中withContext,async,launch几种异步的区别

在 Kotlin 协程中,withContext、async 和 launch 是常用的异步/并发操作函数,它们的主要区别在于用途和返回值:1. launch 作用:启动一个新的协程,用于执行不返回结果的并发任务。使用场景:适合执行没有返回…

git 报错fatal: refusing to merge unrelated histories

解决方案在你操作命令后面加--allow-unrelated-histories 例如: git merge master --allow-unrelated-historiesgit pull或者git push报fatal: refusing to merge unrelated histories 同理: git pull origin master --allow-unrelated-histories

Android 13----在framworks层映射一个物理按键

基于Android 13.一、映射步骤确定要映射的物理按键值在kl文件中增加键值对在InputEventLabels.cpp增加AKEYCODE在keycodes.h中定义AKEYCODE值attrs.xml中增加KEYCODEKeyEvent.java中增加KEYCODE在PhoneManagerWindow等相关类中进行拦截处理相关KEYCODE,属于具体的业…

【Java EE】Mybatis-Plus

1. 开始先进行和以前一样的项目配置、数据库连接配置&#xff0c;在这些基础上&#xff0c;额外引入 Mybatis-Plus 依赖即可。<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><vers…

各版本操作系统对.NET支持情况(250707更新)

借助虚拟机和测试机&#xff0c;检测各版本操作系统对.NET的支持情况。 安装操作系统后&#xff0c;安装相应运行时并能够运行星尘代理或幸运四叶草为通过条件。 测试平台&#xff1a;VMware Workstation 镜像来源&#xff1a;MSDN I Tell You 参考&#xff1a; .NET Fram…

5-Kafka-replication(副本机制)概念

&#x1f504; Kafka 副本机制&#xff08;Replication&#xff09; 核心概念概念说明Replica (副本)分区的完整拷贝&#xff0c;分布在不同 BrokerReplication Factor副本总数&#xff08;含 Leader&#xff09;&#xff0c;生产环境建议 ≥3Leader Replica处理所有读写请求&a…

langgraph的ReAct应用

一、什么是langgraph的ReActLangGraph 中的 ReAct&#xff08;Reasoning Acting&#xff09;代理是一种结合推理与行动能力的 AI 代理架构&#xff0c;通过动态决策链实现复杂任务处理。以下是其核心要点及实践指南。1、ReAct 代理的核心原理1.1工作流程&#xff1a;ReAct 代理…

一个编辑功能所引发的一场知识探索学习之旅(JavaScript、HTML)

文章目录一个编辑功能所引发的一场知识探索学习之旅&#xff08;JavaScript、HTML&#xff09;1. 一个编辑功能案例2. 知识点探索学习3. 参考资料一个编辑功能所引发的一场知识探索学习之旅&#xff08;JavaScript、HTML&#xff09; 1. 一个编辑功能案例 HTML&#xff1a; &l…

kali制作Windows木马

环境描述&#xff1a;攻击机&#xff1a;Kali-2025实验靶机&#xff1a;Windows11不要攻击他人&#xff0c;这只是网络安全实验还是一样获取IP地址制作好之后开服务&#xff0c;上传下载在靶机右键保留下载记得把防火墙&#xff0c;安全中心关了否则无法下载之后就可以kali控制…

从零实现一个GPT 【React + Express】--- 【1】初始化前后端项目,实现模型接入+SSE

摘要 本系列文章主要是实现一个能够对话以及具有文生图等功能的模型应用。主要UI界面会参考chat-gpt,豆包等系列应用。模型使用的是gpt开源的大模型。 如果你是一个前端开发工程师需要一个自己的开源项目&#xff0c;可以学习这个系列的文章&#xff0c;不需要有很完整的后端…

【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个整数存入顺序表&#xff0c;对任一给定整数 x&#xff0c;将其插入顺序表中指定的第 i 个位置。注意&#xff1a;i 代表位序&#xff0c;从 1 开始&#xff0c;不是数…

汽车智能化2.0引爆「万亿蛋糕」,谁在改写游戏规则?

进入2025年&#xff0c;长安、奇瑞、比亚迪等各大主机厂纷纷将智能化推进至全新高度&#xff0c;中国汽车智能化竞争进入了“技术市场生态”综合较量阶段。一方面&#xff0c;各大主机厂全力推进辅助驾驶的规模化普及&#xff0c;掀起了一场关于高阶辅助驾驶的“技术平权”革命…

QT 第八讲 --- 控件篇 Widget(三)界面系列

前言&#xff1a; 在上一讲《QT 第七讲 --- 控件篇 &#xff08;二&#xff09;window系列与qrc机制》中&#xff0c;我们探讨了应用程序窗口&#xff08;QMainWindow, QWidget&#xff09;的基础结构、窗口标志、状态以及Qt强大的资源管理机制&#xff08;.qrc文件&#xff0…

广州华锐互动:AR 领域的创新与服务先锋​

&#xff08;一&#xff09;定制化服务​ 广州华锐互动秉持 “以客户为中心” 理念&#xff0c;为客户提供高度定制化 AR 解决方案。项目初期&#xff0c;通过多种方式深入了解客户需求&#xff0c;挖掘痛点。基于需求分析&#xff0c;技术团队运用自主研发技术和先进算法&…

暑假算法日记第一天

目标​&#xff1a;刷完灵神专题训练算法题单 阶段目标&#x1f4cc;&#xff1a;【算法题单】滑动窗口与双指针 LeetCode题目:1456. 定长子串中元音的最大数目643. 子数组最大平均数 I1343. 大小为 K 且平均值大于等于阈值的子数组数目2090. 半径为 k 的子数组平均值2379. 得…

【软考高项】信息系统项目管理师-第1章 信息化发展(1.5 数字化转型与元宇宙、1.6 标题类知识点、1.7 十四五规划内容汇总)

文章大纲 第1章 信息化发展1.5 数字化转型与元宇宙1.5.1 数字化转型1.5.2 元宇宙1.6 标题类知识点1.7 十四五规划内容汇总1.8 10道试题第1章 信息化发展 学习建议: 此章内容大部分为新增内容,基本是全新的章节2023年5月考试2分选择,5分案例2023年下半年各批次选择题2分左右1.…

STM32F103C8T6单片机内部执行原理及启动流程详解

引言&#xff1a;为什么深入理解STM32启动流程很重要&#xff1f;STM32F103C8T6作为嵌入式开发中最常用的单片机之一&#xff0c;其内部执行原理和启动流程是理解嵌入式系统底层运行机制的核心。无论是开发Bootloader、调试HardFault异常&#xff0c;还是优化系统启动速度&…