我一直在尝试寻找将视频从 Unity 相机流式传输到 RTSP 流的方法。
到目前为止,我一直在这里尝试这个特定的插件 https://github.com/keijiro/FFmpegOut 它将相机的目标纹理作为输入,并将其作为 MP4 文件输出到磁盘上,并且 https ://github.com/aler9/rtsp-simple-server 作为简单的 RTSP 服务器
我最初的想法是,这就像更改原始 FFMPEG 命令行语法一样简单:
"-y -f rawvideo -vcodec rawvideo -pixel_format rgba"
+ " -colorspace bt709"
+ " -video_size 800x600"
+ " -framerate 30"
+ " -pix_fmt yuv420p"
+ " test.mp4"
对此:
"-y -re -f rawvideo -vcodec rawvideo -pixel_format rgba"
+ " -colorspace bt709"
+ " -video_size 800x600"
+ " -framerate 30"
+ " -pix_fmt yuv420p"
+ " -f rtsp -rtsp_transport tcp rtsp://127.0.0.1:8554/stream"
这适用于我可以在 VLC 播放器上观看的流媒体的前 4-5 秒。但在那之后,该进程就会挂起,我必须以相同的行为终止它,无论它是通过 Unity 编辑器运行还是作为独立运行。
非常感谢任何对此的帮助,或者关于我应该如何查明链的哪一部分可能崩溃的想法,甚至是我可以研究的替代插件/资源来实现这一目标。谢谢!
编辑:还查看了 Unity Player 和 Editor 日志,但没有任何错误消息。
我可以确认这对我也有效。 我找不到实际原因或可能出现的错误,应该这样设置。
如果使用https://github.com/keijiro/FFmpegOut
public FFmpegPipe(string arguments)
{
// Start FFmpeg subprocess.
_subprocess = Process.Start(new ProcessStartInfo {
FileName = ExecutablePath,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = false
});
// Start copy/pipe subthreads.
_copyThread = new Thread(CopyThread);
_pipeThread = new Thread(PipeThread);
_copyThread.Start();
_pipeThread.Start();
}
将 RedirectStandardError 更改为 false
作为额外的奖励,我花了一段时间才将 mediamtx.exe args 设置为平滑:
string ffmpegArgs = $"-y -f rawvideo -pix_fmt rgba -s {width}x{height} -r {frameRate} -i - " +
$"-c:v libx264 -preset ultrafast -tune zerolatency -b:v 1M -g 30 -bufsize 8M -f rtsp -rtsp_transport tcp {rtspUrl}";