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

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

×