求助:如何用FFmpeg将Unity生成的Raw Video通过RTSP网络推流
解决Unity RawVideo流通过FFmpeg推UDP/RTSP的问题
首先,你遇到的IOException大概率是因为直接替换输出为UDP地址时,缺少了流媒体适配的封装格式和编码配置——本地文件输出(比如MP4)和网络推流的要求完全不同,MP4是适合本地存储的容器,而UDP/RTSP推流需要用适合网络传输的封装(比如MPEG-TS),同时编码参数也要调整为低延迟、适合流媒体的设置。
一、先修复UDP推流的IOException问题
原来的命令针对本地文件优化,改成UDP推流需要调整以下几点:
- 指定流媒体封装格式:UDP推流常用
mpegts封装,需要用-f mpegts参数声明 - 调整编码参数:虽然你用了
ultrafast和crf 0,但要确保编码是流媒体友好的H.264(默认就是,但可以显式指定) - 打开更详细的日志:把
-loglevel warning改成-loglevel info,方便排查具体错误
修改后的UDP推流命令:
ffmpeg -y -f rawvideo -vcodec rawvideo -pixel_format rgba -colorspace bt709 -video_size 1280x720 -framerate 30 -loglevel info -i - -c:v libx264 -pix_fmt yuv420p -preset ultrafast -crf 23 -f mpegts udp://192.168.x.x:23000?pkt_size=1316
这里的关键调整:
- 把
yuv444p改成yuv420p:几乎所有流媒体播放器都支持YUV420P,兼容性更好 - 加了
-c:v libx264显式指定H.264编码(避免FFmpeg自动选不合适的编码) pkt_size=1316:适配UDP的MTU大小,减少分片丢包- 把
crf 0改成crf 23:CRF 0是无损编码,体积极大,不适合网络推流;23是默认的平衡值,你可以根据需求调整(数值越小质量越高,体积越大)
如果还是出现IOException,先检查:
- 目标IP和端口是否可达:确保同局域网的目标机器没有防火墙拦截23000端口
- Unity插件的标准输出是否正确:插件是否真的把RawVideo流正确输出到FFmpeg的标准输入(
-i -) - FFmpeg进程的权限:是否有网络访问权限(Windows下可能需要防火墙允许FFmpeg联网)
二、RTSP推流的正确方案
如果最终目标是RTSP推流,有两种常用方式:
方式1:用FFmpeg搭建临时RTSP服务器
FFmpeg自带简易RTSP服务器功能,适合测试使用,命令如下:
ffmpeg -y -f rawvideo -vcodec rawvideo -pixel_format rgba -colorspace bt709 -video_size 1280x720 -framerate 30 -loglevel info -i - -c:v libx264 -pix_fmt yuv420p -preset ultrafast -crf 23 -f rtsp rtsp://0.0.0.0:8554/unitystream
然后同局域网的机器可以用VLC或者其他RTSP播放器打开rtsp://你的机器IP:8554/unitystream来观看。
方式2:推流到现成的RTSP服务器(比如EasyDarwin、Live555)
如果需要更稳定的RTSP服务,建议部署一个专门的RTSP服务器,然后用FFmpeg推流到服务器的地址,命令示例:
ffmpeg -y -f rawvideo -vcodec rawvideo -pixel_format rgba -colorspace bt709 -video_size 1280x720 -framerate 30 -loglevel info -i - -c:v libx264 -pix_fmt yuv420p -preset ultrafast -crf 23 -f rtsp rtsp://服务器IP:554/stream
三、排查Unity IOException的额外技巧
- 单独测试FFmpeg命令:在命令行手动模拟输入(比如用
cat test.raw | 你的FFmpeg推流命令),看是否能正常运行,排除Unity插件的问题 - 查看FFmpeg的错误输出:Unity插件应该能捕获FFmpeg的标准错误输出,把这些日志导出来,能精准定位问题(比如端口被占用、编码不支持等)
- 检查Unity的管道输出:确保插件是将RawVideo流以正确的格式(RGBA、1280x720、30fps)输出到FFmpeg的标准输入,格式不匹配也会导致错误
内容的提问来源于stack exchange,提问作者Jan Discart




