.net 框架中 RTSP 网络摄像机的后台播放和输出到 http 流
Background playback for RTSP IP Camera in .net framework and output to http stream
我目前正在研究允许客户端实时回放 IP 摄像机的最佳方法,其中我的服务器是使用 RTSP 抓取流的源,因此同时我需要能够将实时回放输出到HTML5 标准播放器 "the video tag" 无论何时,我都需要能够快速获取快照。
我尝试使用 WebRequest 获取快照,但问题是相机准备快照需要大约 1 秒。
我尝试了这里的另一个解决方案 但是该图像需要 2 秒才能为我的应用程序做好准备。
更新 1
我通过命令行界面使用 ffmpeg.exe 并传递了 args:
"-i rtsp://UN:PW@IP:554/live -vframes 1 -f singlejpeg -"
然后在我开始该过程后,我使用以下方法将流读入输出,这是我的图像二进制文件:
process.StandardOutput.BaseStream.CopyTo(output);
现在我唯一剩下的问题是我想继续读取 rtsp 并以例如“每秒 2 帧”的速率获取二进制文件。有任何可行的代码想法吗?
好吧,我想我想出了如何做我需要做的事情。
首先,记下可以正常使用 ffmpeg 的命令参数:
-rtsp_transport tcp -i rtsp://UN:PW@IP:554/live -err_detect ignore_err -r 10 -f image2pipe -
接下来,您已经这样设置了您的流程:
using (var process = new Process
{
StartInfo = new ProcessStartInfo
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
Arguments = arguments,
FileName = fFMpegExePath
},
EnableRaisingEvents = true
})
{
// code body
}
现在您需要 process.Start() 然后开始收听 process.StandardOutput.BaseStream 作为 FileStream 和逐字节处理读取。
请注意,我设置了一个低帧率 -r 10 因为如果根本不设置,流将无缘无故挂起,但在这种情况下我测试了任务超过 2 小时并且它永远不会失败。
希望对遇到此问题的各位有所帮助。
我目前正在研究允许客户端实时回放 IP 摄像机的最佳方法,其中我的服务器是使用 RTSP 抓取流的源,因此同时我需要能够将实时回放输出到HTML5 标准播放器 "the video tag" 无论何时,我都需要能够快速获取快照。
我尝试使用 WebRequest 获取快照,但问题是相机准备快照需要大约 1 秒。
我尝试了这里的另一个解决方案
更新 1
我通过命令行界面使用 ffmpeg.exe 并传递了 args:
"-i rtsp://UN:PW@IP:554/live -vframes 1 -f singlejpeg -"
然后在我开始该过程后,我使用以下方法将流读入输出,这是我的图像二进制文件:
process.StandardOutput.BaseStream.CopyTo(output);
现在我唯一剩下的问题是我想继续读取 rtsp 并以例如“每秒 2 帧”的速率获取二进制文件。有任何可行的代码想法吗?
好吧,我想我想出了如何做我需要做的事情。 首先,记下可以正常使用 ffmpeg 的命令参数:
-rtsp_transport tcp -i rtsp://UN:PW@IP:554/live -err_detect ignore_err -r 10 -f image2pipe -
接下来,您已经这样设置了您的流程:
using (var process = new Process
{
StartInfo = new ProcessStartInfo
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
Arguments = arguments,
FileName = fFMpegExePath
},
EnableRaisingEvents = true
})
{
// code body
}
现在您需要 process.Start() 然后开始收听 process.StandardOutput.BaseStream 作为 FileStream 和逐字节处理读取。 请注意,我设置了一个低帧率 -r 10 因为如果根本不设置,流将无缘无故挂起,但在这种情况下我测试了任务超过 2 小时并且它永远不会失败。
希望对遇到此问题的各位有所帮助。