当前位置: 首页 > news >正文

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

# 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.dtcms.com/a/272615.html

相关文章:

  • 系统性部署系统母盘【rhel7和rhel9】
  • 7月10号总结 (1)
  • 大数据的安全挑战与应对
  • Linux:库的原理
  • swift开发,关于应用、页面、视图的生命周期
  • [C++ STL] list类的刨析及简易实现
  • 亚马逊首个“海折节”,缘何加码进口电商?
  • java多线程环境下资源隔离机制ThreadLocal详解
  • C#内插字符串:从语法糖到深度优化
  • 学习笔记(32):matplotlib绘制简单图表-数据分布图
  • 入门级别的Transformer模型介绍
  • Rust中Option和Result详解
  • 微调性能赶不上提示工程怎么办?Can Gradient Descent Simulate Prompting?——论文阅读笔记
  • Apache Shiro 框架详解
  • 【三维生成】FlashDreamer:基于扩散模型的单目图像到3D场景
  • Express 入门指南(超详细教程)
  • 机器学习之逻辑回归和k-means算法(六)
  • 32多串300A保护板测试仪:新能源电池安全的核心守护者
  • 生成式人工智能实战 | 自注意力生成对抗网络(Self-Attention Generative Adversarial Network, SAGAN)
  • 深入理解fork():系统调用创建进程的原理与实践
  • 项目部署:nginx的安装和配置
  • 利用Pandas进行条件替换与向前填充
  • Linux中的命令连接符
  • Layui —— select
  • 图解Java数据容器(三):Queue
  • CAS登录工作流程简述
  • 【前端】【Echarts】ECharts 词云图(WordCloud)教学详解
  • Prompt提示词的主要类型和核心原则
  • 在vscode中和obsidian中使用Mermaid
  • Spring AI Alibaba(2)——通过Graph实现工作流