如何通过FFmpeg、mediamtx等工具将远程树莓派USB摄像头的原始音视频流复制到Windows 11的FFmpeg或本地文件?
如何通过FFmpeg、mediamtx等工具将远程树莓派USB摄像头的原始音视频流复制到Windows 11的FFmpeg或本地文件?
我来帮你梳理这个问题的解决思路和最终可行方案,结合你已经尝试的内容,核心就是绕开编码环节和RTSP的像素格式限制,直接传输原始音视频流,完美匹配你节省树莓派CPU和USB带宽的需求。
最终可行方案(UDP传输原始音视频)
这是你已经验证接近完美的方法,完全满足“不编码视频、不存盘树莓派”的要求,分发送端和接收端配置:
树莓派(发送端)命令
ffmpeg -use_wallclock_as_timestamps 1 -thread_queue_size 1024 -f alsa -i "plughw:CARD=CameraB409241,DEV=0" -video_size 640x480 -thread_queue_size 1024 -i /dev/video0 -c:v copy -c:a copy -f matroska udp://ReceiverIP:port
- 关键参数说明:
-c:v copy和-c:a copy强制直接复制原始音视频流,完全不占用树莓派CPU编码;用matroska封装是因为它原生支持YUYV422原始视频和PCM音频,不需要额外转码;-thread_queue_size避免音视频队列溢出,-use_wallclock_as_timestamps确保两端时间戳同步。
Windows 11(接收端)命令
直接保存为完整文件:
ffmpeg -use_wallclock_as_timestamps 1 -f matroska -i udp://TrasnmitterIP:port -c:v copy -c:a copy Output.mkv
自动分段保存(比如每300秒生成一个文件):
ffmpeg -use_wallclock_as_timestamps 1 -f matroska -i udp://TrasnmitterIP:port -c:v copy -c:a copy -f segment -segment_time 300 -reset_timestamps 1 Output_%03d.mkv
- 小技巧:如果遇到“非单调DTS”警告,可尝试去掉
-use_wallclock_as_timestamps 1或-reset_timestamps参数。
之前踩过的坑分析
1. mediamtx + RTSP的像素格式问题
你用-c:v copy直接传YUYV422视频到RTSP时触发的“Unsupported pixel format”错误,本质是RTSP的标准封装(如RTP)天生不支持YUYV422这类原始像素格式,它更适配经过编码的视频(H.264/H.265等),所以直接复制原始流走RTSP这条路本身就走不通。
后来你尝试强制指定输入像素格式为yuv420p,导致视频损坏,是因为摄像头实际输出的是YUYV422,格式不匹配时FFmpeg无法正确解析原始流。
2. ncat直接传/dev/video0的问题
用cat /dev/video0 | ncat ...确实能传输数据,但因为没有封装容器,接收端没有视频分辨率、帧率、像素格式等元数据,自然无法解析成可用文件。必须用FFmpeg把原始流封装成matroska这类容器,接收端才能识别并正确保存。
补充:TCP传输方案(解决UDP丢包顾虑)
如果担心UDP的丢包问题,可换成TCP传输,只需要修改命令:
接收端先启动监听(Windows 11)
ffmpeg -listen 1 -use_wallclock_as_timestamps 1 -f matroska -i tcp://0.0.0.0:port -c:v copy -c:a copy Output.mkv
发送端连接传输(树莓派)
ffmpeg -use_wallclock_as_timestamps 1 -thread_queue_size 1024 -f alsa -i "plughw:CARD=CameraB409241,DEV=0" -video_size 640x480 -thread_queue_size 1024 -i /dev/video0 -c:v copy -c:a copy -f matroska tcp://ReceiverIP:port
备注:内容来源于stack exchange,提问作者CupNoodleFanatic
相关产品推荐
相关产品推荐

