如何使用Elixir / HTTPoison或Hackney获取视频流?

时间:2016-08-31 07:33:49

标签: elixir multipart-mixed-replace httpoison

我正在尝试使用Elixir / HTTPoison从凸轮获取流并将其转储到文件中。 网址 x.x.x.x / axis-cgi / mjpg / video.cgi?duration = 1& resolution = 320x240

使用DHC(Chrome插件)中的网址,我可以拥有以下内容:

  

回复200确定

     

HEADERS Cache-Control:no-cache Pragma:no-cache Expires:Thu,01 Dec   1994 16:00:00 GMT连接:关闭内容类型:   多部分/ X - 混合取代; boundary = myboundary X-Time-Offset:   62044.312573相当完整的请求标头接受: / 接受编码:gzip,deflate,sdch   接受语言:fr-FR,fr; q = 0.8,en-US; q = 0.6,en; q = 0.4   Content-Type:application / xml User-Agent:Mozilla / 5.0(Windows NT   6.1; WOW64)AppleWebKit / 537.36(KHTML,和Gecko一样)Chrome / 52.0.2743.116 Safari / 537.36注意:XHR会自动添加   标题包括Accept,Accept-Language,Cookie,User-Agent等。

原始格式化正文向我展示了很多由 - myboundary 事物分隔的二进制jpeg图像。

  

- myboundary

     

内容类型:image / jpeg

     

内容长度:11848

     

JFIF W u]7W u]7 2 TY“ C

现在,我想尝试用Elixir做同样的事情。

  test "request headers from cam" do
    options = [hackney: [basic_auth: {"login","password"}]]
    {:ok, %HTTPoison.AsyncResponse{id: id}} = HTTPoison.get "http://x.x.x.x/axis-cgi/mjpg/video.cgi?duration=1&resolution=320x240",[], [stream_to: self, recv_timeout: :infinity, hackney: options]
    assert_receive %HTTPoison.AsyncStatus{id: ^id, code: 200}, 1_000
  end

我的确有以下回应,

  1) test request headers from cam (NewsequenceTest)
     test/newsequence_test.exs:9
     No message matching %HTTPoison.AsyncStatus{id: ^id, code: 200} after 1000ms.
     The following variables were pinned:
       id = #Reference<0.0.3.125>
     Process mailbox:
       %HTTPoison.AsyncStatus{code: 401, id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncHeaders{headers: [{"Date", "Wed, 31 Aug 2016 06:47:00 GMT"}, {"Accept-Ranges", "bytes"}, {"Connection", "close"}, {"WWW-Authenticate", "Digest realm=\"AXIS_ACCC8E545922\", nonce=\"0000fa64Y50235919055a42f91d3dea744b10d2dab9653\", stale=FALSE, qop=\"auth\""}, {"WWW-Authenticate", "Basic realm=\"AXIS_ACCC8E545922\""}, {"Content-Length", "189"}, {"Content-Type", "text/html; charset=ISO-8859-1"}], id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncChunk{chunk: "<HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD>\n<BODY><H1>401 Unauthorized</H1>\nYour client does not have permission to get URL /axis-cgi/mjpg/video.cgi from this server.\n</BODY></HTML>\n", id: #Reference<0.0.3.125>}
       %HTTPoison.AsyncEnd{id: #Reference<0.0.3.125>}
     stacktrace:
       test/newsequence_test.exs:12: (test)

我在没有基本身份验证的情况下尝试了相同的结果。

我还不明白这个auth错误发生了什么。 当然我误解了一些东西,有人可以请教我这个问题吗?

亲切的问候,

皮尔

1 个答案:

答案 0 :(得分:1)

所以这里的问题是代码在调用:

HTTPoison.get(..., [], [..., hackney: [hackney: [basic_auth: {"login","password"}]]])

而不是:

HTTPoison.get(..., [], [..., hackney: [basic_auth: {"login","password"}]])

导致hackney忽略它们,因为它试图获取opts[:hackney][:basic_auth]等所有nil

修复方法是替换:

options = [hackney: [basic_auth: {"login","password"}]]

options = [basic_auth: {"login","password"}]