Неверный формат файла Mpeg после передачи Elixir/HTTPoison
После моего (тупого) вопроса и чтения этого
Мне удалось подключиться к моей камере, получить поток от него и сбросить его в файл 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
J ‡JFIFˇ˛ W "XW" Xˇ˛ ß2¨ÃéTY"ˇ€C
Он попытался воспроизвести несколько параметров безуспешно, похоже, что файл не распознается как файл MPEG.
Какие-нибудь мысли? С уважением, Пьер
1 ответ
На самом деле, Elixir/HTTPoison или HTTPotion не несут ответственности.
Из Википедии
В мультимедиа Motion JPEG (M-JPEG или MJPEG) - это формат сжатия видео, в котором каждый видеокадр или чересстрочное поле цифровой видеопоследовательности сжимается отдельно как изображение JPEG. Первоначально разработанный для мультимедийных приложений для ПК, M-JPEG теперь используется устройствами видеозахвата, такими как цифровые камеры, IP-камеры и веб-камеры; и нелинейными системами видеомонтажа. Он изначально поддерживается QuickTime Player, консолью PlayStation и веб-браузерами, такими как Safari, Google Chrome, Mozilla Firefox и Microsoft Edge.
Я попытался вручную извлечь 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)
С Уважением,
пьер