# 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,如果后續有更多需求,如音視頻同步、云端推流等高級功能,可在此基礎上擴展。遇到新問題,建議先本地錄制排查源頭,再逐步定位到推流、協議、播放器等環節。