You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:如何用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参数声明
  • 调整编码参数:虽然你用了ultrafastcrf 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的额外技巧

  1. 单独测试FFmpeg命令:在命令行手动模拟输入(比如用cat test.raw | 你的FFmpeg推流命令),看是否能正常运行,排除Unity插件的问题
  2. 查看FFmpeg的错误输出:Unity插件应该能捕获FFmpeg的标准错误输出,把这些日志导出来,能精准定位问题(比如端口被占用、编码不支持等)
  3. 检查Unity的管道输出:确保插件是将RawVideo流以正确的格式(RGBA、1280x720、30fps)输出到FFmpeg的标准输入,格式不匹配也会导致错误

内容的提问来源于stack exchange,提问作者Jan Discart

火山引擎 最新活动