Elixir / HTTPoison传输后Mpeg文件格式不正确

时间:2016-09-01 16:54:09

标签: elixir mpeg httpoison

跟随我(愚蠢)question 并阅读this

我设法连接到我的摄像头,从中获取流并将其转储到mpeg文件中。以下是更清晰的代码。

test "request headers from cam" do
    options = [basic_auth: {"LOGIN","PASSWORD"}, ibrowse: [{:save_response_to_file, true}]]
    {:ok, %HTTPoison.AsyncResponse{id: id}} = HTTPoison.get "http://x.x.x.x/axis-cgi/mjpg/video.cgi?duration=2&resolution=320x240",[], [stream_to: self, recv_timeout: :infinity, hackney: options
                                                                                                                                              ]
    {:ok, file} = File.open("/tmp/test.mpeg", [:write])
    retour = stream_to_file(id,file)
    send self,{:retour, retour}
    assert_receive {:retour ,:ok}, 10_000
  end

  defp stream_to_file(id, output) do
    receive do
     %HTTPoison.AsyncStatus{ id: ^id, code: code} ->
        IO.puts " AsyncStatus"
        stream_to_file(id,output)
      %HTTPoison.AsyncHeaders{ id: ^id} ->
        stream_to_file(id,output)
      %HTTPoison.AsyncEnd{ id: ^id} ->
        IO.puts " AsyncEnd received"
        :ok
      %HTTPoison.AsyncChunk{id: ^id, chunk: chunk} ->
        IO.binwrite(output, chunk)
        stream_to_file(id, output)
    end
  end

测试运行正常,文件按预期生成但是当我尝试阅读它时(使用几个播放器),我可以偷偷地从凸轮上看到一个图像,然后它就会停止。

大小(取决于参数)可能很重要,在编辑文件时,我可以清楚地猜测这些是连续的Jpeg文件。

这是文件的开头。

  

- myboundary Content-Type:image / jpeg Content-Length:9609

     

ÿ‡JFIF˛W»XW»X˛ß2¨éé“€C

它试图使用几个参数但没有成功,看起来文件不被识别为mpeg文件。

有什么想法? 问候, 皮尔

1 个答案:

答案 0 :(得分:0)

事实上,Elixir / HTTPoison或HTTPotion不负责任。

来自Wikipedia

  

在多媒体中,Motion JPEG(M-JPEG或MJPEG)是视频压缩   格式,其中每个视频帧或数字的隔行扫描场   视频序列作为JPEG图像单独压缩。本来   为多媒体PC应用开发,M-JPEG现在被用于   视频捕捉设备,如数码相机,IP摄像机和   网络摄像头;以及非线性视频编辑系统。它是原生的   由QuickTime Player,PlayStation控制台和Web支持   浏览器,如Safari,谷歌Chrome,Mozilla Firefox和微软   边缘。

我试图从原始文件本身手动提取Jpeg文件,并且在成功尝试之后,我发现最快的方法是使用python(如果你不在2.7中可能会略有不同,例如:cv2.IMREAD_COLOR)和OpenCv

import cv2
import urllib 
import numpy as np
import os

stream=open('./example.mjpg','rb')
sizemax = os.path.getsize("./example.mjpg")
bytes=''
allbytes = 0
nimage = 0
while nimage * 1024 < sizemax:
     nimage= nimage + 1
     bytes+=stream.read(1024)
     allbytes += allbytes + 1024
     a = bytes.find('\xff\xd8')
     b = bytes.find('\xff\xd9')
     if a!=-1 and b!=-1:
        jpg = bytes[a:b+2]
        bytes= bytes[b+2:]
        i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.IMREAD_COLOR)
        cv2.imshow('i',i)
        if cv2.waitKey(1) ==27:
            exit(0) 

此致

皮尔