Софт ccamera - когда одной игровой камеры уже мало

chromiusj

Известный
Автор темы
Модератор
6,082
4,445
Untitled-ezgif.com-optimize.gif

Добрый день, уважаемые гости и негости данного форума.

В данной теме будет представлена библиотека захвата веб-камер для GTA:SA/SAMP. Название позаимствовано в дань уважения у класса CCamera из одноимённой игры.
Ниже будет предоставлено API для перечисления устройств, управления захватом и отображения видеопотока, а также файл с полноценным примером работы с библиотекой.











После подключения библиотеки:
Lua:
local ccamera = require 'ccamera'
доступны следующие функции.

Ccamera:
ФункцияОписание
ccamera.version()Возвращает версию библиотеки
ccamera.enumerate()Возвращает список доступных камер в формате { id, name }
ccamera.new(device_id)Создаёт объект камеры для указанного устройства. Захват автоматически не запускается
ccamera.set_render_device(ptr)Передаёт библиотеке указатель на IDirect3DDevice9
ccamera.unload()Останавливает все камеры, принадлежащие текущему Lua-скрипту

Объект Camera:

МетодОписание
cam:start(width, height, fps)Запускает захват с указанными параметрами
cam:stop()Останавливает захват и освобождает ресурсы устройства
cam:is_capturing()Возвращает состояние захвата (true / false)
cam:texture_id()Возвращает текстуру Direct3D9 для отображения
cam:actual_fps()Возвращает фактическую частоту кадров видеопотока
cam:resolution()Возвращает фактическое разрешение текущего видеопотока
cam:set_device(device_id)Переключает объект на другое устройство
cam:last_error()Возвращает текст последней ошибки
cam:destroy()Принудительно освобождает все ресурсы камеры

Параметры width, height и fps, передаваемые в cam:start(), являются запрашиваемыми значениями. Фактические параметры видеопотока определяются драйвером устройства и возможностями камеры. Например:
cam:start(1920, 1080, 60)
не гарантирует получение потока 1920x1080 @ 60 FPS.
Для получения фактических параметров используйте:
cam:resolution()
cam:actual_fps()
Примеры кода:
Список устройств:
Lua:
local devices = ccamera.enumerate()

for _, device in ipairs(devices) do
    print(device.id, device.name)
end

Пример результата:
Lua:
{
    { id = 0, name = "Dilbarov OBS Virtual GayCam" },
    { id = 1, name = "Grodno HD Webcam" }
}
Получение фактического режима:
Lua:
local ok, err = cam:start(1920, 1080, 60)
if ok then
    local width, height = cam:resolution()
    local fps = cam:actual_fps()
    print(string.format("actual: %dx%d @ %.1f fps", width, height, fps))
end
Переключение устройства:
Lua:
local ok, err = cam:set_device(1)
if not ok then
    print(err)
end
Если захват уже выполняется, библиотека автоматически перезапустит его с последними запрошенными параметрами.
При использовании mimgui необходимо передать библиотеке указатель на игровой IDirect3DDevice9 следующим образом:
Lua:
local imgui = require 'mimgui'
local ccamera = require 'ccamera'

ccamera.set_render_device(getD3DDevicePtr()) -- в начале кода, или в мейне

-- После запуска камеры:

local tex = cam:texture_id()

if tex then
    imgui.Image(tex, imgui.ImVec2(640, 480))
end

Обработка ошибок:
Lua:
local cam, err = ccamera.new(10)
if not cam then
    print(err)
end
Возможные категории ошибок:
КатегорияОписание
device_not_foundУстройство не найдено
device_busyУстройство используется другим приложением
access_deniedДоступ к устройству запрещён операционной системой
unsupported_constraintsЗапрошенные параметры не поддерживаются устройством
d3d9_unavailableНедоступно устройство Direct3D9
internalВнутренняя ошибка библиотеки

Установка: распаковать архив ccamera в директорию moonloader/lib/
Благодарности:
ccap - за удобную библиотеку для захвата камеры
@wqaddfs0 - за помощь и поддержку в разработке
Андрей Бурим - за согласие в тестирование библиотеке (на гифке пример работы)
 

Вложения

  • ccamera.rar
    121.8 KB · Просмотры: 5
  • ccamera[test].lua
    6.2 KB · Просмотры: 3
Последнее редактирование:

chromiusj

Известный
Автор темы
Модератор
6,082
4,445
Библиотека была обновлена до версии 1.1.0. Что нового:
1. Добавлен метод cam:actual_fps() - для получения фактической частоты кадров
2. Переработана выгрузка библиотеки (спасибо @MrCreepTon за референс в mirror )
3. Добавил некоторую инфу про фактические данные захватывающих устройств, чтобы не запутаться как разработчикам, так и рядовым пользователям, если захотите попробовать изменить свойства вебки (пока я тестировал работу свойств, которую не захотел добавлять в эту версию, чуть не угробил вебку на своем ноуте)