从Mjpeg中提取Jpg

时间:2009-11-14 08:15:51

标签: c#

尝试从Axis IPCam返回的Mjpeg中提取jpg。

从文档中,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)

问题:

  1. 我可以将Encoding.Ascii用于返回Httpresponse Stream吗?这样所有字节都将以字符串形式出现?

  2. 从(1),我如何通过解析获得(二进制输出)?

  3. 我希望能得到我能得到的所有帮助。

    由于

3 个答案:

答案 0 :(得分:4)

手动解析Mjpeg流可能很麻烦且容易出错。这就是为什么有一个优秀的图书馆,旨在做到这一点。我建议你看看aforge哪些能够处理Mjpeg流。下载库,将AForge.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();
    }
}

答案 1 :(得分:0)

试试这个:

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);
}

答案 2 :(得分:0)

对于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