C# 从Mjpeg中提取Jpg

C# 从Mjpeg中提取Jpg,c#,C#,试图从Mjpeg中提取jpg,Mjpeg从Axis IPCam返回 Axis IPCam将从文档中返回包含Mjpeg的HttpResponse 在这里,我使用这个代码,我不知道如何继续 HttpWebRequest webrequest = null; HttpWebResponse webresponse = null; webrequest = (HttpWebRequest)WebRequest.Create(uri); webresponse = (HttpWebResponse)w

试图从Mjpeg中提取jpg,Mjpeg从Axis IPCam返回

Axis IPCam将从文档中返回包含Mjpeg的HttpResponse

在这里,我使用这个代码,我不知道如何继续

HttpWebRequest webrequest = null;
HttpWebResponse webresponse = null;  
webrequest = (HttpWebRequest)WebRequest.Create(uri);
webresponse = (HttpWebResponse)webrequest.GetResponse();

StreamReader sr = new StreamReader(
    webresponse.GetResponseStream().Encoding.ASCII);
string result = sr.ReadToEnd();
HttpResponse中的Mjpeg将类似于:

--myboundary
Content-Type: image/jpeg
Content-Length: 3159
(BINARY)  <-----------This is Jpeg 
--myboundary

Content-Type: image/jpeg
Content-Length: 3162
(BINARY)
--myboundary
Content-Type: image/jpeg
Content-Length: 3151
(BINARY)
--myboundary
内容类型:图像/jpeg
内容长度:3159
(二进制)试试这个:

int i = 0;
foreach (Match m in Regex.Matches(input, 
         @"Content-Length:.*?\r\n\r\n(?<base64>[\s\S]*)\r\n\r\n"))
{
    byte[] data = Convert.FromBase64String(m.Groups["base64"].Value);
    //File.WriteAllBytes(String.Format(@"c:\image{0}.jpg", i++), data);
}
inti=0;
foreach(在正则表达式中匹配m.Matches(输入,
@“内容长度:.*?\r\n\r\n(?[\s\s]*)\r\n\r\n”))
{
字节[]数据=Convert.FromBase64String(m.Groups[“base64”].Value);
//File.writealBytes(String.Format(@“c:\image{0}.jpg”,i++),数据);
}
试试这个:

int i = 0;
foreach (Match m in Regex.Matches(input, 
         @"Content-Length:.*?\r\n\r\n(?<base64>[\s\S]*)\r\n\r\n"))
{
    byte[] data = Convert.FromBase64String(m.Groups["base64"].Value);
    //File.WriteAllBytes(String.Format(@"c:\image{0}.jpg", i++), data);
}
inti=0;
foreach(在正则表达式中匹配m.Matches(输入,
@“内容长度:.*?\r\n\r\n(?[\s\s]*)\r\n\r\n”))
{
字节[]数据=Convert.FromBase64String(m.Groups[“base64”].Value);
//File.writealBytes(String.Format(@“c:\image{0}.jpg”,i++),数据);
}

手动解析Mjpeg流可能会很麻烦且容易出错。这就是为什么有一个优秀的库设计来做到这一点。我建议您考虑一下,除其他事项外,哪些能够处理Mjpeg流。下载该库,将对
a org.Video.dll的引用添加到您的项目中,并享受其中的乐趣

以下是从Axis相机源捕获单个帧的示例:

class Program
{
    static void Main(string[] args)
    {
        MJPEGStream stream = new MJPEGStream("http://146.176.65.10/axis-cgi/mjpg/video.cgi");
        stream.NewFrame += (sender, e) =>
        {
            e.Frame.Save("test.jpg", ImageFormat.Jpeg);
            Console.WriteLine("frame saved into test.jpg");
            // stop capturing frames
            ((MJPEGStream)sender).Stop();
        };
        // start capturing frames
        stream.Start();
        Console.ReadLine();
    }
}

手动解析Mjpeg流可能很麻烦且容易出错。这就是为什么有一个优秀的库设计来做到这一点。我建议您考虑一下,除其他事项外,哪些能够处理Mjpeg流。下载该库,将对
a org.Video.dll的引用添加到您的项目中,并享受其中的乐趣

以下是从Axis相机源捕获单个帧的示例:

class Program
{
    static void Main(string[] args)
    {
        MJPEGStream stream = new MJPEGStream("http://146.176.65.10/axis-cgi/mjpg/video.cgi");
        stream.NewFrame += (sender, e) =>
        {
            e.Frame.Save("test.jpg", ImageFormat.Jpeg);
            Console.WriteLine("frame saved into test.jpg");
            // stop capturing frames
            ((MJPEGStream)sender).Stop();
        };
        // start capturing frames
        stream.Start();
        Console.ReadLine();
    }
}

对于C#,似乎存在称为gstreamer sharp的gstreamer绑定。你可能想看看这个。我可以将下面的命令转换为C代码。C#API应该类似

您正在尝试使用命令行直接保存图像吗?如果是这样,请使用命令行中的gstreamer工具保存一系列jpeg图像

gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg

对于C#,似乎存在称为gstreamer sharp的gstreamer绑定。你可能想看看这个。我可以将下面的命令转换为C代码。C#API应该类似

您正在尝试使用命令行直接保存图像吗?如果是这样,请使用命令行中的gstreamer工具保存一系列jpeg图像

gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg

当你说“(二进制)”时,你是指base64块吗?这个(二进制)实际上指的是图像或照片。我想它指的是图像的字节。图像位于每个分隔器调用的内部:--myboundary。你看,在一个httpresponse中可以有30个这样的图像。任务是提取图像,它包含在每一个——myboudary中。所以,我的问题是,当我用Ascii编码这个流时,字节是否会用字符串表示。希望你能帮我解决这个问题。当你说“(二进制)”时,你是指base64块吗?这个(二进制)实际上指的是图像或照片。我想它指的是图像的字节。图像位于每个分隔器调用的内部:--myboundary。你看,在一个httpresponse中可以有30个这样的图像。任务是提取图像,它包含在每一个——myboudary中。所以,我的问题是,当我用Ascii编码这个流时,字节是否会用字符串表示。希望你能帮我解决这个问题。提前谢谢你,谢谢你提供的信息。我认为这是一个伟大的工具。我希望我能学会一点如何处理这个问题。我希望你能告诉我怎么做。顺便问一下,该工具是否可以在Dotnetcompact环境中使用?谢谢。我非常感谢这个帖子。谢谢。谢谢你提供的信息。我认为这是一个伟大的工具。我希望我能学会一点如何处理这个问题。我希望你能告诉我怎么做。顺便问一下,该工具是否可以在Dotnetcompact环境中使用?谢谢。我非常感谢这个帖子。谢谢