Неверный формат файла 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) 

С Уважением,

пьер

Другие вопросы по тегам