bangka 0 Опубликовано 21 Августа 2020 В 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 за шпаргалку Поделиться этим сообщением Ссылка на сообщение Поделиться на других сайтах В
Станислав 0 Опубликовано 21 Августа 2020 Спасибо, что сообщили о результате и дополнили информацию. Поделиться этим сообщением Ссылка на сообщение Поделиться на других сайтах В
AlexeyRemizov 0 Опубликовано 13 Апреля 2021 Здравствуйте! Пишу в эту тему, потому как, вопрос более всего приближен к её названию. Я работаю над интеграцией DevLine с ПО предприятия, и для связи с регистраторами использую API RPC DevLine, задача у меня состоит в том, чтобы выполнять запросы к видеорегистраторам на доступность архива за определённый промежуток времени и в случае успеха запрашивать отдельный кадр. У меня получилось выполнить запрос с именем метода "archive.get_frames_list" и я получил список доступных записей фреймов с идентификаторами (content-type в запросе, я указывал application/json), но запрос отдельного фрейма по идентификатору в формате application/x-msgpack, как написано в спецификации, не получается. Если я указываю формат application/json я получаю ответ, где в поле "raw_bytes" присутствуют данные, но прочитать я их не могу, возможно потому, что неверно указал формат данных. Есть ли у Вас какие-либо примеры по работе с архивом через API RPC? Поделиться этим сообщением Ссылка на сообщение Поделиться на других сайтах В
Станислав 0 Опубликовано 13 Апреля 2021 Здравствуйте! Переношу Ваше сообщение в эту тему, прошу ознакомится с ней. raw_bytes дополнительно декодировать не нужно. Версию прошивки регистратор уточните и покажите запрос и ответ. Готовых примеров, к сожалению, нет. Поделиться этим сообщением Ссылка на сообщение Поделиться на других сайтах В
russki666 0 Опубликовано 13 Апреля 2021 2 часа назад, Станислав сказал: Готовых примеров, к сожалению, нет. Линия 8, html5, архив работает через API rpc, код на js. Кадры jpeg 3 поток, но так же можно брать 1,2. Но для этого лучше другой язык использовать и декодировать кадры через ffmpeg либы Поделиться этим сообщением Ссылка на сообщение Поделиться на других сайтах В