我设法连接到我的摄像头,从中获取流并将其转储到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文件。
有什么想法? 问候, 皮尔
答案 0 :(得分:0)
事实上,Elixir / HTTPoison或HTTPotion不负责任。
在多媒体中,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)
此致
皮尔