c# - .net 框架中 RTSP IP 摄像机的后台播放并输出到 http 流
问题描述
我目前正在研究允许客户端实时回放 IP 摄像机的最佳方法,其中我的服务器是使用 RTSP 获取流的源,因此同时我需要能够将实时回放输出到 HTML5 标准播放器“视频标签”,无论何时,我都需要能够快速获取快照。
我尝试使用WebRequest来获取快照,但问题是相机准备快照大约需要 1 秒。
我尝试了另一种解决方案,例如从 RTSP 中提取缩略图,但该图像需要 2 秒才能为我的应用程序做好准备。
更新 1
我设法通过命令行界面使用ffmpeg.exe并传递参数来获得单帧:
“-i rtsp://UN:PW@IP:554/live -vframes 1 -f singlejpeg -”
然后在我开始这个过程之后,我将流读入输出,它是我的图像二进制文件,使用:
process.StandardOutput.BaseStream.CopyTo(输出);
现在我唯一剩下的问题是我想继续阅读 rtsp 并以例如“每秒 2 帧”的速率获取二进制文件。任何工作代码的想法?
解决方案
好吧,我想我知道如何去做我需要做的事情了。首先,记下对 ffmpeg 没有问题的命令 args:
-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 小时并且它永远不会失败。
我希望它可以帮助所有遇到这个问题的人。
推荐阅读
- django - 在 django 中创建编辑视图的问题
- angular - 使用 Angular 将图像上传到 Django Rest Framework 编码错误
- c# - Newtonsoft.Json.Linq.JArray.Parse(string)' 有一些无效参数
- c - 如何使用 node-rpio 在 Raspberry pi 4 上访问 /dev/mem
- visual-studio-code - 错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'
- ios - 如何在较新的 Xcode 上安装较旧的 iOS 运行时?
- arrays - 按可选属性排序的 Swift 数组
- laravel - Laravel Model Eloquent 将结果列表更改为分组数据
- apache-kafka - 用 KStream 语义重组
- regex - 如何替换sed中匹配字符串中所有出现的字符