Jump to content
Andrey_Ra

Кадры через API - как конвертировать?

Recommended Posts

В 23.05.2018 в 20:47, Andrey_Ra сказал:

А вот полный код программы PHP, которая формирует этот самый linia.h264, выгружая кадры нужного канала за искомый период (дальнейшую обработку можете дописать сами):

  Добавлю реализацию на Python (3.8.5). Для работы скрипта необходимо поставить дополнительно msgpack, requests 

import msgpack
import requests
from requests.auth import HTTPDigestAuth
import sys

# Настройки
channel = 2
start_time = [2020, 8, 14, 17, 48, 50]
end_time = [2020, 8, 14, 18, 20, 50]
login = 'admin'
password = 'admin'
url = 'http://127.0.0.1:9786/rpc'
header = {'Content-type': 'application/x-msgpack'}

data = msgpack.packb(
{
"method" : "archive.get_frames_list",
 "params" :
    {
    "channel" : channel,
    "stream" : "video",
    "start_time" : start_time,
    "end_time" : end_time
    }
}
)
# print(data)
try:
    a = requests.post(url, auth=HTTPDigestAuth(login, password), data=data, headers=header)
except Exception as e:
    print("Error: ", e)
    sys.exit(1)

try:
    frames = msgpack.unpackb(a.content)
except Exception as e:
    print(f"Error {a.status_code}: ", e)
    sys.exit(1)

# print(frames)
frames_id = []
key_frame = 0
for frame in frames['result']['frames_list']:
    # print(frame)
    if (key_frame == 0) and (frame['gop_index'] != 0):
        # print('Not a key')
        pass
    else:
        if (frame['gop_index']==0):
            key_frame+=1
            frames_id.append([])
            # print('Found key')
        frames_id[key_frame-1].append(frame['id'])

print("Скачиваем групп кадров: ", len(frames_id))
f = open('linia.h264','wb')
for frame_keys in frames_id:
    # print("Frame_keys", frame_keys)
    print("#", end='')
    for frame in frame_keys:
        # print(frame)
        data = msgpack.packb(
            {"method": "archive.get_frame","params":{"channel": channel,"stream": "video","id": frame}}
                        )
        a = requests.post(url, auth=HTTPDigestAuth(login, password), data=data, headers=header)
        payload = msgpack.unpackb(a.content, raw=True)
        f.write(payload[b'result'][b'frame'][b'raw_bytes'])
f.close()
print("\r\nРабота программы завершена")

Спасибо Andrey_Ra за шпаргалку :)

Share this post


Link to post
Share on other sites

Спасибо, что сообщили о результате и дополнили информацию.

Share this post


Link to post
Share on other sites

Здравствуйте!

 

Пишу в эту тему, потому как, вопрос более всего приближен к её названию. Я работаю над интеграцией DevLine с ПО предприятия, и для связи с регистраторами использую API RPC DevLine, задача у меня состоит в том, чтобы выполнять запросы к видеорегистраторам на доступность архива за определённый промежуток времени и в случае успеха запрашивать отдельный кадр. У меня получилось выполнить запрос с именем метода "archive.get_frames_list"  и я получил список доступных записей фреймов с идентификаторами (content-type в запросе, я указывал application/json),  но запрос отдельного фрейма по идентификатору в формате application/x-msgpack, как написано в спецификации, не получается. Если я указываю формат application/json я получаю ответ, где в поле "raw_bytes" присутствуют данные, но прочитать я их не могу, возможно потому, что неверно указал формат данных. Есть ли у Вас какие-либо примеры по работе с архивом через API RPC?

Share this post


Link to post
Share on other sites

Здравствуйте!

Переношу Ваше сообщение в эту тему, прошу ознакомится с ней.

raw_bytes дополнительно декодировать не нужно.

Версию прошивки регистратор уточните  и покажите запрос и ответ. 

Готовых примеров, к сожалению, нет.

Share this post


Link to post
Share on other sites
2 часа назад, Станислав сказал:

Готовых примеров, к сожалению, нет.

Линия 8, html5, архив работает через API rpc, код на js. Кадры jpeg 3 поток, но так же можно брать 1,2. Но для этого лучше другой язык использовать и декодировать кадры через ffmpeg либы

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×