gPhoto2 решает практические задачи управления совместимой цифровой камерой с компьютера: определяет подключённую модель, читает содержимое карты памяти, снимает кадры, сразу передаёт их на диск, меняет доступные параметры камеры, ждёт события затвора и запускает интервальные серии. Программа особенно полезна фотографам, техническим специалистам, владельцам фотобудок, лабораторных установок и Raspberry Pi-проектов, где важны повторяемые команды и автоматизация без ручной работы в фирменной утилите камеры.
- Пакетная обработка серии фото
- Ретушь и удаление объектов
- Замена и размытие фона
- Нет штатного графического интерфейса
- Функции зависят от модели камеры
- Нужна работа с командной строкой
Что представляет собой gPhoto2 на практике
gPhoto2 — командный клиент к библиотеке libgphoto2. Это важное различие: именно libgphoto2 знает протоколы камер и содержит драйверы, а команда gphoto2 даёт пользователю доступ к этим возможностям из терминала. Поэтому список функций нельзя воспринимать как одинаковый для любой подключённой камеры. У одной модели будут доступны только просмотр и загрузка файлов, у другой — удалённый спуск, Live View, изменение выдержки, диафрагмы, ISO, баланса белого и точки фокусировки. Точный набор всегда определяется сочетанием камеры, режима USB, версии libgphoto2 и конкретного драйвера.
У проекта нет собственного обязательного каталога сессий, базы фотографий или RAW-проявщика. Он работает ближе к оборудованию: отправляет команды камере, получает события, скачивает созданные файлы и печатает структурированный ответ. Благодаря этому gPhoto2 удобно встраивается в shell-скрипты, systemd-сервисы, cron-задачи, Python-программы и любые процессы, где один кадр должен автоматически запускать следующую операцию — копирование, переименование, обработку, резервное сохранение или передачу в другую систему.
Текущие сборки gPhoto2 и libgphoto2 могут иметь разные номера версий — это нормально, потому что клиент и библиотека выпускаются отдельно. При диагностике полезно смотреть оба номера командой gphoto2 --version: она показывает сам клиент, libgphoto2, libgphoto2_port и опции, с которыми они собраны. Это позволяет понять, почему одинаковая команда ведёт себя по-разному на двух компьютерах.
Установка и начало работы
На Linux gPhoto2 обычно проще ставить из репозитория дистрибутива. В Debian и Ubuntu пакет называется gphoto2; в Fedora он также доступен как отдельный пакет командного клиента. На macOS распространённый способ — установка через Homebrew. При работе на Raspberry Pi разумно сначала использовать пакет из репозитория системы, а собирать свежую версию вручную только тогда, когда поддержка конкретной камеры действительно требует новой libgphoto2.
sudo apt update
sudo apt install gphoto2
gphoto2 --version
После установки не нужно создавать проект или импортировать каталог. Подключите камеру качественным USB-кабелем, включите её и выберите на самой камере режим, совместимый с PTP или удалённым управлением, если производитель предлагает несколько вариантов USB-подключения. Камеры, работающие только как USB Mass Storage, не являются типичным сценарием для libgphoto2: такой накопитель операционная система и без неё видит как обычный диск.
Первый тест — gphoto2 --auto-detect. Команда выводит таблицу с моделью и портом. Для USB-камеры порт выглядит как usb:BBB,DDD, где числа отражают текущие номера шины и устройства. Они могут меняться после переподключения, поэтому в постоянном скрипте лучше не «прибивать» адрес без необходимости, если камера единственная.
gphoto2 --auto-detect
gphoto2 --summary
gphoto2 --abilities
--summary запрашивает сводку о текущем устройстве, а --abilities показывает возможности драйвера. Если камера определяется, но съёмка не заявлена, это не ошибка интерфейса gPhoto2: конкретный драйвер или режим устройства может поддерживать только чтение файлов.

Как читать сведения о поддержке камеры
В официальном списке libgphoto2 для каждой модели перечисляются отдельные способности: Image Capture, Trigger Capture, Liveview, Configuration и другие. Наличие модели в списке само по себе не означает, что можно менять все параметры или снимать видео. Для практической проверки полезнее связка из трёх команд: обнаружение, способности и список конфигурации.
gphoto2 --auto-detect
gphoto2 --abilities
gphoto2 --list-config
Если --list-config возвращает десятки или сотни путей вида /main/capturesettings/..., камера предоставляет развитый набор управляемых свойств. Если список короткий, надо строить рабочий процесс вокруг реально доступных параметров, а не пытаться повторять команды из инструкции к другой модели. Даже у камер одного бренда названия элементов и допустимые значения могут отличаться.
Команда gphoto2 --manual показывает справку конкретного драйвера, а gphoto2 --about — сведения о нём. Для неизвестной камеры это полезнее общих советов из форумов: драйвер может требовать включить на корпусе режим PC Control, сменить назначение USB-порта, вставить карту памяти или, наоборот, использовать захват в оперативную память.

Поддержка libgphoto2 очень широкая и включает тысячи камер и медиаплееров, но уровни поддержки неодинаковы. Для студийного применения желательно проверять не только факт обнаружения модели, но и именно те операции, которые нужны в процессе: удалённый спуск, Live View, выбор ISO, работа с RAW+JPEG и события добавления файла.
Сводка, способности и информация о хранилище
gphoto2 --summary полезна как «паспорт текущего соединения». В зависимости от модели она может показать производителя, модель, версию прошивки, серийный номер, форматы объектов, сведения о хранилище и свойства устройства. На PTP/MTP-камере вывод бывает большим: это нормально, потому что протокол описывает типы объектов и свойства, которые камера объявляет компьютеру.
gphoto2 --storage-info запрашивает сведения о носителях камеры. Это удобно перед длительной сессией: можно убедиться, что программа видит нужный слот и что камера вообще сообщает информацию о хранилище. Однако gPhoto2 не заменяет мониторинг свободного места на уровне всей системы. Если съёмка идёт напрямую на компьютер, контролировать свободный диск всё равно должен ваш скрипт или операционная система.
--abilities особенно полезна при автоматизации: она помогает заранее понять, разумно ли вызывать захват, загрузку, удаление или конфигурационные операции. Но окончательная проверка всё равно должна происходить фактической командой, потому что состояние камеры может меняться — например, при переключении режима на диске, переводе в Live View или запуске записи видео.

Просмотр файлов и папок на камере
Для камеры с доступным файловым хранилищем gPhoto2 показывает папки и файлы без необходимости открывать графический файловый менеджер. Базовые команды — --list-folders и --list-files. Сокращения -l и -L делают то же самое.
gphoto2 --list-folders
gphoto2 --list-files
Если у камеры несколько каталогов, используйте --folder или -f и передайте путь, который вывела программа. Для обхода вложенных папок существуют --recurse и --no-recurse. Это важно при переносе большого архива: без понимания текущей папки легко получить список только одного каталога и решить, что часть кадров пропала.
Файлы в выводе нумеруются, и многие операции принимают диапазон. Например, --get-file 7-13 скачивает элементы с номерами от 7 до 13 в выбранной папке. Можно передавать и имена файлов, если драйвер их поддерживает. Нумерация удобна в интерактивной работе, а в автоматизации безопаснее опираться на имена или структурированный вывод, когда сценарий должен переживать появление новых кадров.
gphoto2 --folder /store_00010001/DCIM/100CANON --list-files
gphoto2 --folder /store_00010001/DCIM/100CANON --get-file 7-13
В новых сборках есть режим --parsable, который делает список файлов более пригодным для разбора скриптом. Перед использованием в переносимом сценарии проверьте, что установленная версия gPhoto2 действительно поддерживает этот параметр.
Загрузка фотографий на компьютер
--get-file скачивает выбранные файлы, а --get-all-files или -P — все файлы в текущем каталоге. Если нужна выборочная работа с превью, есть --get-thumbnail и --get-all-thumbnails. Для отдельных драйверов предусмотрены операции с raw-data, EXIF и метаданными, но наличие таких данных зависит от камеры.
gphoto2 --get-file 1-10
gphoto2 --get-all-files
gphoto2 --get-all-files --new
Опция --new просит скачивать только файлы, которые камера помечает как ещё не загруженные. Это не универсальная гарантия: поддержка соответствующего флага зависит от драйвера и устройства. Для критичного резервного копирования лучше сочетать её с проверкой имён и локального каталога, а не считать её единственным механизмом дедупликации.
--skip-existing пропускает локальный файл, если он уже существует. --force-overwrite, напротив, разрешает перезапись без вопроса. В автоматическом процессе эти опции принципиально различаются: первая защищает уже полученные кадры от случайной замены, вторая нужна только тогда, когда вы сознательно хотите заменить копию.
При больших объёмах не стоит одновременно запускать второй экземпляр gPhoto2 к той же камере. Большинство камер предполагают одну активную PTP-сессию, и конкурирующие процессы приводят к ошибкам «device busy», «could not claim» или неопределённым PTP-сбоям. Один процесс должен владеть соединением и последовательно выполнять операции.
Имена локальных файлов и шаблоны
Опция --filename задаёт имя или шаблон локального файла при скачивании. Это один из ключевых инструментов для студийных и технических установок: вместо стандартных capt0000.jpg можно сразу формировать осмысленную структуру с датой, временем, исходным именем и порядковым номером.
Шаблон поддерживает обычные спецификаторы даты и времени, а также дополнительные подстановки gPhoto2: %n для номера, %C для расширения, %f для исходного имени без расширения, %F для имени папки камеры. %03n дополняет номер нулями до трёх знаков. Конкретный набор подстановок лучше сверять с локальной man-страницей установленной версии.
gphoto2 --capture-image-and-download --filename "shot_%Y%m%d_%H%M%S.%C"
gphoto2 --get-all-files --filename "%f.%C"
У шаблонов есть практическая ловушка: если два кадра получают одинаковое имя, программа вынуждена либо спросить о перезаписи, либо применить заданную политику. Для серийной съёмки включайте секунды, номер или исходное имя, чтобы имя оставалось уникальным. В новых версиях параметр --filenumber позволяет задать стартовое значение счётчика %n.
В shell-скриптах шаблон надо заключать в кавычки, чтобы оболочка не интерпретировала специальные символы. Кавычки особенно важны, если путь содержит пробелы.
Удаление и загрузка файлов в камеру
--delete-file удаляет выбранные объекты, а --delete-all-files — содержимое текущей папки. По умолчанию массовое удаление не должно автоматически уходить во все вложенные каталоги: рекурсивность задаётся отдельно. Это разумное ограничение, потому что команда необратима на уровне интерфейса gPhoto2.
gphoto2 --delete-file 3
gphoto2 --delete-all-files
Перед автоматическим удалением безопаснее сначала получить список, скачать файлы в отдельный каталог и проверить результат. Если камера снимает RAW+JPEG, один спуск может создавать два объекта. Скрипт, который считает «один кадр = один файл», способен оставить на карте половину пары или удалить не тот объект.
--upload-file существует, но фактическая возможность загрузки зависит от драйвера и камеры. Многие фотоаппараты хорошо отдают файлы, но не разрешают записывать произвольные объекты обратно. Поэтому эту функцию нельзя считать универсальным способом синхронизации карты памяти.
Интерактивный режим gPhoto2 shell
gphoto2 --shell открывает интерактивную среду. Она полезна, когда вы исследуете неизвестную камеру и не хотите каждый раз заново инициализировать соединение. Внутри доступны команды навигации по папкам, получения файлов, удаления, вывода EXIF, запуска съёмки и работы с настройками.
gphoto2 --shell
cd /store_00010001/DCIM/100CANON
ls
get IMG_0001.JPG
list-config
get-config /main/capturesettings/iso
exit
Команда lcd меняет локальный каталог компьютера, а cd — каталог на камере. Это различие удобно помнить при переносе файлов: если случайно поменять только каталог камеры, локальная копия всё равно окажется в текущей директории процесса.
Shell также помогает отделить проблемы камеры от проблем вашего внешнего скрипта. Если в интерактивном режиме capture-image и get-config работают стабильно, а автоматизация падает, искать ошибку надо уже в порядке команд, таймаутах, кавычках, параллелизме или обработке вывода.
Система конфигурации: list-config, get-config и set-config
Управляемые свойства камеры gPhoto2 представляет как дерево конфигурации. --list-config печатает пути, а --get-config показывает конкретный параметр: метку, тип, текущее значение, допустимый диапазон или список вариантов. Не надо угадывать, что камера принимает для ISO или диафрагмы: сначала запросите текущее описание.
gphoto2 --list-config
gphoto2 --get-config /main/capturesettings/iso
gphoto2 --get-config /main/capturesettings/aperture
Тип параметра важен. Для MENU или RADIO вывод содержит Choice с индексами и значениями. Для RANGE указываются минимум, максимум и шаг. Для TOGGLE обычно ожидается логическое значение. Некоторые параметры доступны только для чтения; попытка изменить их должна рассматриваться как нормальное ограничение камеры, а не как повод повторять команду бесконечно.
--set-config NAME=VALUE меняет значение по тексту, --set-config-value явно задаёт значение, а --set-config-index выбирает индекс из списка. Индексы не стоит переносить между моделями: «Choice 4» у другой камеры может означать совершенно другой режим.
gphoto2 --set-config /main/capturesettings/iso=400
gphoto2 --set-config-value /main/capturesettings/aperture=5.6
Короткие имена параметров иногда работают без полного пути, но для устойчивого скрипта предпочтительнее точный путь из --list-config. У разных драйверов встречаются одноимённые свойства в разных ветках, и полный путь уменьшает неоднозначность.
Графический конфигуратор в терминале
Опция gphoto2 --config может открыть текстовый интерфейс на базе CDK, если клиент собран с соответствующей поддержкой. Это не полноценная студийная панель и не отдельное GUI-приложение, но способ интерактивно посмотреть доступные настройки без ручного ввода каждого пути. Если сборка сделана без CDK, рассчитывать на этот режим нельзя.
В рабочей автоматизации всё равно лучше использовать --get-config и --set-config: они воспроизводимы и дают понятный журнал действий. Интерактивный конфигуратор удобен для первичного изучения камеры.
Что реально можно менять в камере
У современных PTP-камер через libgphoto2 часто доступны ISO, выдержка, диафрагма, баланс белого, формат/качество файла, режим фокусировки, компенсация экспозиции, цель сохранения, состояние Live View и другие параметры. Но это не единый стандартный набор. Например, один Nikon может называть свойство выдержки shutterspeed, другой драйвер отдаст более длинный путь; часть Sony или Canon требует определённого режима на диске камеры.
Правильный алгоритм настройки выглядит так:
- Подключить камеру и убедиться, что она обнаружена.
- Получить
--list-configименно на этой модели. - Для каждого нужного свойства выполнить
--get-config. - Проверить допустимые значения и текущее состояние.
- Только затем применять
--set-config. - После изменения повторно запросить параметр и убедиться, что камера его приняла.
Такой подход особенно важен для фотобудки или лабораторной установки, где пользователь не видит экран камеры. Скрипт должен проверять состояние и прекращать сессию с понятной ошибкой, если нужный параметр недоступен.
Три основных способа сделать кадр
--capture-image, --capture-image-and-download и --trigger-capture решают разные задачи. Неправильный выбор приводит к путанице с местом хранения и ожиданием файла.
| Команда | Что делает | Когда применять |
|---|---|---|
--capture-image |
Запускает съёмку и оставляет результат на камере | Когда файл должен остаться в хранилище камеры |
--capture-image-and-download |
Снимает и сразу получает созданный файл на компьютер | Tethered-сессии и автоматическая обработка |
--trigger-capture |
Только инициирует спуск и возвращает управление | Когда события и загрузку обрабатывает отдельный этап |
Для --capture-image-and-download по умолчанию действует режим --no-keep: после успешной загрузки файл не сохраняется на карте в рамках этого сценария. Если копия должна остаться в камере, добавьте --keep. Для RAW+JPEG есть --keep-raw: RAW остаётся на карте, а JPEG можно скачать для быстрого просмотра. Конкретное поведение всё равно зависит от возможностей камеры.
gphoto2 --capture-image-and-download --keep
gphoto2 --capture-image-and-download --filename "session_%03n.%C"
Если камера настроена сохранять в SDRAM, результат может существовать только в рамках активной сессии и должен быть скачан сразу. Для длительных процессов важно заранее решить, где находится «мастер-копия»: на карте, на компьютере или одновременно в двух местах.
Tethered-съёмка и ожидание событий
В tethered-сценарии фотограф нажимает спуск на самой камере, а компьютер получает событие и забирает новый файл. Для этого предназначен --capture-tethered; близкий по смыслу вариант — --wait-event-and-download. Работа требует поддержки событий со стороны камеры и драйвера.
gphoto2 --capture-tethered
gphoto2 --wait-event-and-download=10s
Практическая ценность такого режима — отделение момента съёмки от оператора компьютера. Фотограф работает камерой, а gPhoto2 автоматически подхватывает кадры для просмотра, каталогизации или обработки. Это типичный фундамент студийного tethering без графической оболочки.
--wait-event может ждать заданное время, количество событий или строковое совпадение, в зависимости от версии клиента. В длительном процессе надо предусмотреть корректное завершение. В новых версиях SIGUSR2 завершает tethering/wait-event без грубого убийства процесса, а SIGUSR1 может инициировать дополнительный кадр в соответствующих режимах.
Если события приходят нестабильно, не стоит увеличивать число параллельных запросов. Сначала проверьте, что другая программа не держит камеру, карта не переполнена, камера не ушла в сон и драйвер действительно отмечает модель как поддерживающую захват.
Интервальная съёмка и таймлапс
gPhoto2 умеет повторять захват с интервалом. --interval или -I задаёт время между кадрами, --frames или -F — количество кадров. Значение -F 0 используют для бесконечной серии, которую затем останавливают внешним условием.
gphoto2 --capture-image-and-download --interval 30 --frames 120
gphoto2 --capture-image --interval 60 --frames 0
Интервал — не гарантия точного метрономического периода до миллисекунды. Камере требуется время на экспозицию, запись на карту, передачу файла и подготовку к следующему кадру. RAW, шумоподавление длинной выдержки, медленная карта и USB-соединение увеличивают фактический цикл. Для научной установки, где время критично, измеряйте временные метки фактически полученных файлов или внешнего триггера, а не предполагаемый идеальный период.
Получение SIGUSR1 в интервальном режиме заставляет сделать кадр немедленно. С --reset-interval таймер интервала после такого сигнала начинает отсчёт заново. Значение интервала -1 позволяет ждать сигнала без автоматического спуска. Это удобно, когда аппаратный датчик или другая программа решает, когда именно снимать.
Для многосуточного таймлапса критичны питание, отключение сна камеры, свободное место, контроль ошибок и ротация журналов. gPhoto2 исполняет команды, но не решает за пользователя вопросы электропитания и физической надёжности USB-соединения.
Предпросмотр, Live View и поток превью
--capture-preview запрашивает один быстрый кадр предпросмотра, если камера это поддерживает. Обычно это JPEG меньшего разрешения, предназначенный для кадрирования и контроля, а не замена полноценному RAW. --show-preview умеет показать быстрый предпросмотр в терминале через ASCII-графику, если клиент собран с aalib.
gphoto2 --capture-preview
gphoto2 --show-preview
--capture-movie в gPhoto2 исторически означает поток кадров предпросмотра, объединённых в Motion-JPEG-подобный поток, а не универсальную команду записи полноценного видеоролика камерой. При наличии --stdout этот поток можно передать другому процессу, например кодировщику или серверу трансляции. Частота кадров и задержка зависят от камеры, USB, декодирования и всей цепочки.
gphoto2 --capture-movie=10s --stdout
На некоторых камерах перед Live View нужно включить конфигурационный параметр вроде viewfinder; точное имя проверяется через --list-config. Нельзя копировать название свойства из инструкции к Canon и ожидать, что оно подойдёт Nikon или Sony.

Если нужен низколатентный видеовход для видеоконференций, gPhoto2 сам по себе не превращает камеру в UVC-веб-камеру. Обычно строят отдельный конвейер с v4l2loopback, FFmpeg, GStreamer или приложением, которое читает preview-поток. Такой сценарий выходит за рамки собственно gPhoto2 и требует оценки задержки и стабильности всей связки.
Bulb и длительные выдержки
В современных man-страницах есть опция --bulb SECONDS, предназначенная для длительной экспозиции на поддерживаемой камере. Однако реальная работоспособность зависит от того, предоставляет ли драйвер нужный механизм. На части моделей длинную выдержку удобнее реализовать через конфигурационные свойства режима затвора и события.
gphoto2 --capture-image-and-download --bulb 30
При Bulb-съёмке учитывайте, что камера может быть занята дольше, чем заданное время: после закрытия затвора возможна запись большого RAW, внутренняя обработка и шумоподавление. Следующую команду нужно отправлять только после возвращения камеры в готовое состояние.
Для астрофото и лабораторной съёмки полезно логировать не только имя файла, но и время начала команды, время события захвата и момент завершения загрузки. Это помогает отличить задержку экспозиции от задержки передачи по USB.
Запись видео: что можно и чего нельзя ожидать
Некоторые DSLR и беззеркальные камеры позволяют через конфигурационные свойства включать настоящую видеозапись на карту. В документации gPhoto2 приведены отдельные схемы для определённых поколений Nikon и Canon: у Nikon встречается переключение свойства movie, у Canon EOS — управление целевой записью и Live View. Это не единая команда, работающая на любом фотоаппарате.
Перед автоматизацией видео сначала вручную получите --list-config в режиме видео и сравните его с режимом фото. Камера может скрывать или менять набор свойств после поворота диска режима. Также возможны ограничения производителя: карта памяти должна быть вставлена, запись может останавливаться по температуре или лимиту длительности, а видеособытие не всегда передаётся тем же способом, что фото.
Если задача — получить поток изображения для компьютерного зрения, чаще используют preview-поток. Если задача — записать файл камерой в штатном качестве, нужно управлять именно режимом видеозаписи модели, а затем дождаться завершения и скачать созданный объект.
Hook-скрипты: обработка каждого скачанного кадра
Опция --hook-script запускает пользовательский скрипт при событиях жизненного цикла gPhoto2. Скрипт получает переменную окружения ACTION. Документированы значения init, start, download и stop. Для события download переменная ARGUMENT содержит путь скачанного файла.
gphoto2 --capture-tethered --hook-script ./after-shot.sh
Это удобнее бесконечного опроса каталога: обработчик запускается сразу после получения кадра. В нём можно создавать превью, копировать файл в сетевой каталог, вызывать RAW-конвертер, писать запись в базу, отправлять сигнал внешнему оборудованию или запускать контроль качества.
Есть два важных правила. Во-первых, hook должен корректно игнорировать неизвестные значения ACTION, чтобы будущие изменения не ломали сценарий. Во-вторых, тяжёлую обработку лучше выносить в очередь, если она способна задержать основной процесс. Иначе длительное преобразование одного RAW может помешать своевременно принимать следующие кадры.
Если hook возвращает ненулевой код на этапе init, gPhoto2 прекращает работу. Это можно использовать для предварительной проверки: доступно ли место, существует ли каталог, запущена ли нужная служба.
Работа с несколькими камерами
--auto-detect показывает каждую найденную камеру и её порт. Для конкретного устройства можно использовать --port, а при необходимости также --camera. В документации отдельно отмечено: если модель задаётся через --camera, нужно также указать порт, иначе параметр модели может быть проигнорирован.
gphoto2 --auto-detect
gphoto2 --port usb:001,006 --summary
gphoto2 --port usb:001,007 --summary
Несколько камер не означают, что один экземпляр gPhoto2 управляет ими параллельно. Обычно строят по одному последовательному процессу на устройство и аккуратно привязывают каждый к своему USB-порту. При переподключении номера портов могут измениться, поэтому профессиональная установка часто добавляет уровень идентификации по серийному номеру или физической топологии USB.
Одновременный спуск двух камер через два независимых USB-сеанса не гарантирует аппаратной синхронизации. Планировщик ОС, USB-хабы и внутренняя реакция камер создают разброс. Для стереосъёмки или фотограмметрии с жёсткими требованиями к синхронности нужен внешний триггер или специализированная схема, а gPhoto2 используют для настройки и последующей загрузки.
Потоки stdout и интеграция с другими программами
--stdout направляет получаемые данные в стандартный вывод. Это позволяет не создавать промежуточный файл и сразу передать байты следующей программе через pipe. Такой подход встречается при preview-потоках, кодировании, сетевой передаче и компьютерном зрении.
Нужно различать текстовый вывод диагностики и бинарные данные. В скрипте, который ожидает JPEG или MJPEG в stdout, нельзя смешивать их с собственными сообщениями. Логи отправляйте отдельно, а при отладке внимательно проверяйте перенаправления потоков.
--stdout-size печатает размер файла перед данными в поддерживаемом сценарии. Это полезно протоколу-посреднику, который должен заранее знать длину объекта. Для обычной пакетной съёмки проще использовать файлы и hook-события.
RAW, JPEG и метаданные
gPhoto2 не проявляет RAW. Если камера создаёт NEF, CR2, CR3, ARW, RAF или другой RAW и драйвер умеет его получать, программа передаёт файл как объект. Цвет, демозаика, шумоподавление и экспорт выполняются уже внешним RAW-конвертером или редактором.
При RAW+JPEG один спуск может создать два файла. Это влияет на шаблоны имён, hook-скрипты и подсчёт кадров. Не следует считать каждое событие загрузки отдельной экспозицией: скрипт должен группировать связанные объекты по времени, базовому имени или данным камеры.
В man-страницах gPhoto2 присутствуют команды для EXIF и метаданных, включая --show-exif, --get-exif, --get-metadata в подходящих версиях. Часть опций зависит от того, с какими библиотеками собран клиент и какие данные отдаёт драйвер. Если нужна гарантированная обработка EXIF после скачивания, практичнее использовать специализированный локальный инструмент уже на файле.
gPhoto2 на Raspberry Pi и без монитора
Одноплатный компьютер — естественная среда для gPhoto2: камера подключается по USB, а управление идёт по SSH, GPIO-событию или сервису. Такой вариант используют в фотобудках, таймлапс-установках, микроскопах, телескопах и системах машинного зрения.
Для headless-системы важнее всего не интерфейс, а предсказуемое состояние. Сервис при старте должен проверить наличие камеры, доступ к USB, свободное место и требуемые настройки. После сбоя желательно повторно выполнить --auto-detect и --summary, а не слепо продолжать старую последовательность.
Питание камеры через «пустышку» аккумулятора или штатный адаптер часто важнее оптимизации скрипта. На длительной съёмке обычная батарея заканчивается, а автоотключение камеры рвёт PTP-сеанс. Если модель позволяет, отключите авто-сон или предусмотрите периодическую активность, но не используйте недокументированные команды без проверки.
Связка gPhoto2 с Python обычно строится двумя путями: запуск командного клиента через subprocess либо прямое использование Python-binding к libgphoto2. Первый способ проще для небольшого сценария и хорошо повторяет команды из терминала. Прямой binding лучше, когда нужна тонкая обработка событий и долгоживущая сессия без постоянного запуска процессов.
Почему камера бывает «занята» ещё до запуска gPhoto2
Одна из самых частых проблем на Linux — автоматический захват камеры файловым менеджером через GVfs/gphoto. Пользователь подключает фотоаппарат, окружение рабочего стола монтирует его как источник фотографий, после чего gPhoto2 не может открыть ту же PTP-сессию и сообщает, что устройство уже используется.
На современных системах сначала закройте приложения импорта и размонтируйте камеру в файловом менеджере. В окружениях с GVfs можно проверить соответствующее gphoto-монтирование и снять его командой gio mount -s gphoto2. Старые инструкции используют gvfs-mount; на актуальных дистрибутивах имя утилиты могло измениться.
На macOS конфликт способен создавать системный PTP-процесс, который автоматически реагирует на подключение камеры. Поэтому ошибка доступа не всегда означает несовместимость модели. Сначала исключите конкурирующий процесс, затем повторите --auto-detect.
Запуск gPhoto2 от root не должен быть первым способом лечения. Современные Linux-дистрибутивы обычно выдают локальному пользователю доступ через udev/ACL. Если root видит камеру, а обычный пользователь нет, проблема чаще в разрешениях или правилах устройства, и её лучше исправить системно.
Типичные ошибки и их диагностика
Could not claim the USB device
Сначала проверьте, не занята ли камера GVfs, файловым менеджером, фирменной утилитой, другим экземпляром gPhoto2 или процессом импорта. Затем переподключите кабель и снова выполните --auto-detect. Если проблема повторяется, смотрите разрешения на USB-устройство и режим подключения в меню камеры.
Camera is already in use
Смысл ошибки тот же: кто-то держит устройство. Не запускайте параллельные скрипты к одной камере. В долгоживущей системе используйте lock-файл или единственный сервис-владелец, к которому остальные компоненты обращаются через очередь.
No camera found
Проверьте питание, кабель, USB-порт, режим PTP/PC Control и поддержку модели. Запустите gphoto2 --list-ports: для USB должен присутствовать соответствующий портовый драйвер. Если камера видна системе, но не gPhoto2, сравните версию libgphoto2 с версией, в которой появилась поддержка модели.
PTP Device Busy и PTP I/O error
Камера может быть физически занята записью кадра, фокусировкой, обработкой длинной выдержки или переключением Live View. Дайте ей завершить операцию и не посылайте следующий запрос слишком рано. Повторяющаяся I/O-ошибка также бывает признаком плохого кабеля, нестабильного USB-хаба или конфликта процесса.
Capture failed: Perhaps no focus?
Некоторые камеры отказываются снимать в AF, если автофокус не подтверждён. Для теста наведитесь на контрастный объект с хорошим светом либо переведите объектив в ручную фокусировку, если это допустимо в задаче. Это не означает, что удалённый спуск в принципе не поддерживается.
Файл не появился на компьютере
Уточните, какую команду вы использовали. --capture-image не обязана скачивать файл; для немедленной загрузки используйте --capture-image-and-download или соответствующую работу с событиями после --trigger-capture.
Отладочный журнал
Для сложной ошибки gPhoto2 умеет записывать подробный лог. Типичная диагностическая команда сочетает --debug и --debug-logfile. Разработчики проекта рекомендуют также выставлять английскую локаль, чтобы сообщения в журнале были однозначными.
env LC_ALL=C gphoto2 --debug --debug-logfile=gphoto2.log --summary
Лог может содержать серийный номер камеры, пути файлов и другие технические сведения. Перед публикацией в баг-трекере удалите данные, которые не хотите раскрывать, но не вырезайте последовательность PTP-команд, иначе диагностическая ценность исчезнет.
--debug-loglevel в современных сборках позволяет управлять детализацией. Для обычного пользователя сначала достаточно стандартного debug-лога. Пытаться читать каждую PTP-структуру имеет смысл только после воспроизводимого минимального теста.
Сброс зависшего USB-сеанса
Опция --reset сбрасывает выбранный или автоматически определённый USB-порт, имитируя логическое переподключение. Она полезна, когда протокол завис и обычная команда больше не отвечает, но устройство всё ещё видно системе.
gphoto2 --reset
gphoto2 --port usb:001,006 --reset
Это не универсальная кнопка ремонта. Если камера физически зависла, кабель нестабилен или другой процесс продолжает владеть устройством, reset не устранит первопричину. После сброса снова выполните обнаружение и краткую команду вроде --summary, прежде чем возвращаться к длинной сессии.
Производительность без мифических «ускорителей»
Скорость работы gPhoto2 определяется не только программой. На перенос полного RAW влияют размер файла, USB-режим камеры, скорость внутренней записи, карта памяти, хаб, кабель и поведение драйвера. На preview-поток влияют частота, с которой сама камера отдаёт JPEG-превью, и последующая обработка на компьютере.
Ускорять процесс стоит по измеряемому узкому месту. Если задержка возникает до события нового файла, проблема на стороне камеры или экспозиции. Если событие приходит быстро, но скачивание долгое, измеряйте USB и размер объекта. Если файл уже на диске, а просмотр запаздывает, оптимизируйте RAW-декодер или приложение просмотра.
В многокамерной установке не подключайте все устройства к одному дешёвому пассивному хабу и не ожидайте независимой полной скорости. Камеры делят шину и питание. Стабильность часто важнее максимальной пиковой пропускной способности.
При серии RAW+JPEG можно использовать JPEG для оперативного контроля, а RAW оставить на карте или обрабатывать асинхронно. Опция --keep-raw как раз рассчитана на подобный сценарий на поддерживаемых камерах.
Безопасная автоматизация съёмки
Надёжный скрипт отличается от однострочной команды тем, что проверяет предпосылки и результат каждого шага. Минимальная последовательность для фотостанции может выглядеть так:
- Проверить наличие локального каталога и свободного места.
- Выполнить
--auto-detectи убедиться, что найдена ожидаемая камера. - Получить
--summaryили ключевые настройки. - Выставить только нужные параметры и прочитать их обратно.
- Запустить tethered или интервальный режим.
- На каждый скачанный файл выполнить короткий hook и передать работу в очередь.
- При ошибке сохранить лог и прекратить опасные действия вроде удаления с карты.
Особенно осторожно относитесь к автоматическому удалению. Правило «сначала две подтверждённые копии, потом очистка» надёжнее попытки освободить карту сразу после каждого кадра. Для фотобудки это может быть локальный SSD плюс сетевое хранилище; для полевой установки — локальный диск плюс карта камеры.
Если процесс запускается как сервис, задайте понятную политику перезапуска. Бесконечный restart при физически отключённой камере засоряет журнал и USB. Лучше увеличивать паузу между попытками и отдельно сигнализировать оператору о длительном отсутствии устройства.
Практический сценарий: студийная съёмка на компьютер
Для простой студии нужен предсказуемый путь от спуска до файла. Сначала отключите автоматический импорт камеры рабочим столом, проверьте --auto-detect и сделайте один тестовый --capture-image-and-download. Затем задайте каталог и шаблон имени. Если фотограф предпочитает нажимать кнопку на камере, переходите на --capture-tethered.
Hook после загрузки может создавать JPEG-превью и открывать его в отдельном просмотрщике. Сам gPhoto2 не управляет цветом экрана и не заменяет студийный просмотрщик. Разделение обязанностей полезно: gPhoto2 отвечает за связь с камерой, просмотрщик — за быстрое отображение, RAW-конвертер — за проявку.
Перед коммерческой съёмкой протестируйте именно выбранный режим RAW/JPEG и темп работы. Некоторые камеры передают два файла последовательно; в этот момент следующий спуск может быть временно недоступен. Нужно знать поведение своей модели, а не опираться на чужой результат.
Практический сценарий: фотобудка
В фотобудке gPhoto2 обычно работает как исполнитель команды от пользовательского интерфейса. Кнопка на экране или аппаратный вход запускает внешний скрипт, тот при необходимости устанавливает параметры и вызывает --capture-image-and-download. Полученный JPEG передаётся модулю компоновки и печати.
Важная архитектурная деталь — один владелец камеры. Интерфейс, печать и веб-сервис не должны самостоятельно запускать конкурирующие экземпляры gPhoto2. Лучше иметь один процесс-менеджер камеры и очередь команд. Так проще контролировать состояние, повторять неудачный кадр и гарантировать уникальные имена.
Автофокус — типичный источник редких отказов. Если фотобудка стоит в фиксированной зоне с постоянным светом, тестируйте режим фокусировки, который стабильно работает на вашей камере. Не подменяйте аппаратную проблему бесконечными ретраями: десять повторов не помогут, если объектив не может сфокусироваться.
Практический сценарий: предметный таймлапс
Для роста растений, 3D-печати или лабораторного процесса удобно объединить --interval, --frames, шаблон имени и hook. Например, камера делает кадр раз в две минуты, gPhoto2 скачивает его в каталог с временной меткой, hook создаёт уменьшенную копию, а отдельный процесс строит текущий ролик.
gphoto2 --capture-image-and-download --interval 120 --frames 600 --filename "frame_%Y%m%d_%H%M%S_%04n.%C" --hook-script ./after-shot.sh
Не задавайте интервал меньше полного времени цикла без проверки. При длинной выдержке и RAW передаче камера может не успеть подготовиться. Скрипт должен считать успешные файлы, а не просто число попыток.
Если кадр должен делаться по внешнему событию, используйте ожидание сигнала или управляйте gPhoto2 из процесса, который получает GPIO/сетевой триггер. Это лучше, чем частый опрос камеры каждую долю секунды.
Практический сценарий: техническая съёмка и компьютерное зрение
В машинном зрении цифровая фотокамера полезна, когда требуется качество кадра выше типичной веб-камеры и частота невысока. gPhoto2 может управлять экспозицией, получать кадр и передавать его в OpenCV-процесс. Для непрерывного Live View часто строят отдельный MJPEG-поток через --capture-movie --stdout.
Однако DSLR не превращается от этого в промышленную камеру реального времени. Автоэкспозиция, механический затвор, внутренние буферы и PTP создают задержки. Если алгоритму нужен строгий FPS и аппаратный триггер с микросекундной точностью, лучше специализированная камера с подходящим SDK.
Сильная сторона gPhoto2 — управляемый высококачественный одиночный кадр и доступ к большому количеству потребительских камер. Его удобно использовать там, где цена и разрешение важнее детерминированной частоты.
Практический сценарий: перенос фотографий без графического импортера
Если задача — просто выгрузить снимки с камеры на сервер, gPhoto2 позволяет делать это по SSH. После подключения выполните --list-files, затем --get-all-files --skip-existing. Для повторных запусков можно дополнительно использовать --new, если камера поддерживает отметку загруженных объектов.
Сразу удалять файлы после копирования не рекомендуется. Сначала проверьте размер и открываемость локальной копии. Для больших архивов полезно вести журнал исходного имени, папки камеры и локального пути, потому что нумерация файлов на фотоаппарате может циклически повторяться.
Если камера работает как обычный USB Mass Storage и не требует PTP, системное копирование с диска может быть проще и быстрее. gPhoto2 нужен не ради самого факта USB, а ради протоколов и функций, которые обычный файловый доступ не предоставляет.
Команды, которые полезно знать наизусть
| Команда | Назначение |
|---|---|
gphoto2 --version |
Версии клиента, библиотеки и опции сборки |
gphoto2 --auto-detect |
Найти подключённые камеры и их порты |
gphoto2 --summary |
Сводка о текущей камере |
gphoto2 --abilities |
Возможности драйвера |
gphoto2 --list-config |
Доступные параметры управления |
gphoto2 --get-config NAME |
Текущее значение и допустимые варианты |
gphoto2 --set-config NAME=VALUE |
Изменить поддерживаемый параметр |
gphoto2 --list-files |
Список файлов камеры |
gphoto2 --get-all-files |
Скачать все файлы текущей папки |
gphoto2 --capture-image-and-download |
Снять и сразу скачать кадр |
gphoto2 --capture-tethered |
Ждать съёмку камерой и получать файлы |
gphoto2 --reset |
Сбросить USB-сеанс поддерживаемого устройства |
Этот набор покрывает диагностику, конфигурацию, перенос и tethered-съёмку. Остальные опции стоит добавлять после того, как базовая цепочка работает стабильно.
Capture target: карта памяти или оперативная память камеры
На части камер доступно свойство capturetarget. Его смысл практический: определить, куда камера кладёт новый кадр. Значение вроде card означает сохранение на карту памяти; sdram — временный объект в оперативной памяти камеры, который нужно получить в рамках активной сессии. Точные названия и допустимые варианты показывает --get-config.
gphoto2 --get-config capturetarget
gphoto2 --set-config capturetarget=sdram
gphoto2 --capture-image-and-download
SDRAM удобен для фотобудок и технических стендов, где карта не должна накапливать тысячи дублей. Но он требует строгой дисциплины: если соединение завершилось до загрузки, временный объект может исчезнуть. Сохранение на карту надёжнее как резервная копия, зато добавляет операции записи и необходимость следить за свободным местом.
Не каждая камера поддерживает оба режима. Некоторые модели фактически игнорируют изменение, некоторые показывают только один вариант, а у некоторых название свойства отличается. Поэтому переносить готовую команду из чужого сценария нельзя. Сначала прочитайте описание параметра, затем сделайте тестовый кадр и проверьте, где он оказался.
В коммерческой съёмке разумна стратегия «карта + компьютер», если скорость камеры и объём карты это позволяют. В лабораторной установке, где кадры сразу попадают в обработку и есть отдельное резервирование на сервере, SDRAM может уменьшить обслуживание камеры. Решение определяется ценностью исходника и тем, что произойдёт при обрыве USB.
Проверка параметров перед стартом сессии
Автоматизация становится устойчивой, когда она не просто отправляет настройки, а проверяет результат. Камера способна отклонить значение, оставить прежний режим или временно сделать свойство недоступным. Поэтому для критичных параметров полезна схема «прочитать — изменить — прочитать снова».
gphoto2 --get-config /main/capturesettings/iso
gphoto2 --set-config /main/capturesettings/iso=200
gphoto2 --get-config /main/capturesettings/iso
Если вывод содержит RADIO или MENU, скрипт должен убедиться, что желаемое значение присутствует в списке Choice. Для RANGE надо проверять минимум, максимум и шаг. Например, мотор ручной фокусировки может принимать числовой диапазон, который нельзя трактовать как абсолютное расстояние в миллиметрах.
Некоторые свойства появляются только после включения Live View или выбора ручного режима на диске камеры. Другие, напротив, становятся недоступны во время активного preview. Если команда работала вчера и внезапно возвращает ошибку, сравните состояние камеры, а не только версию программы.
Для постоянной фотостанции полезно сохранить эталонный снимок конфигурации в текстовый файл. При обновлении прошивки камеры или libgphoto2 можно сравнить списки и заметить, что путь переименован, появился новый вариант или исчезло старое значение. Это гораздо надёжнее, чем обнаружить изменение уже во время съёмки.
Как строить надёжные shell-скрипты вокруг gPhoto2
gPhoto2 хорошо сочетается с shell, но короткая команда из терминала и производственный скрипт — разные уровни надёжности. Скрипт должен обрабатывать код возврата, создавать каталог, исключать параллельный запуск и писать журнал. Ниже — упрощённая структура, а не универсальный готовый сервис.
#!/bin/sh
set -eu
SESSION="/data/shoot/$(date +%Y%m%d)"
mkdir -p "$SESSION"
cd "$SESSION"
gphoto2 --auto-detect
gphoto2 --capture-image-and-download
--filename "shot_%Y%m%d_%H%M%S_%03n.%C"
set -e останавливает скрипт при ошибке, а set -u не позволяет молча использовать неопределённую переменную. Для сложного процесса этого мало: код возврата отдельных операций часто нужно перехватывать вручную, чтобы отличить временный PTP Busy от отсутствующей камеры.
Не разбирайте человекочитаемый вывод регулярными выражениями без необходимости. Формулировки могут меняться из-за версии и локали. Для диагностических скриптов ставьте LC_ALL=C, а для списков используйте предназначенный для парсинга режим там, где он доступен.
Блокировка важна не меньше обработки ошибок. Перед стартом процесс может создать lock-файл или воспользоваться системным механизмом flock. Иначе два события интерфейса фотобудки запустят две команды почти одновременно, и обе начнут спорить за одну PTP-сессию.
Не помещайте длительную конвертацию RAW прямо между захватами, если камера должна быстро принимать следующий кадр. Сначала сохраните файл и зафиксируйте успешную загрузку, затем передайте путь рабочей очереди. Так связь с камерой остаётся короткой и предсказуемой.
Имена файлов, каталоги сессий и защита от коллизий
Правильная схема хранения важна уже на первом тесте, потому что стандартные имена камеры циклически повторяются. После сброса счётчика или замены камеры снова появится IMG_0001. Если складывать всё в один каталог, рано или поздно возникнет конфликт.
Удобная структура — отдельный каталог на дату или идентификатор заказа, а внутри имя с исходным названием и временной меткой. Например, 2026-10-02/job-184/20261002_151412_IMG_4831.CR3. gPhoto2 может сформировать часть имени через --filename, а внешний скрипт — добавить номер клиента или проекта.
Порядковый %n относится к операции gPhoto2, а не является глобальным вечным счётчиком всей студии. Если процесс перезапущен, планируйте коллизии заранее. Новые версии позволяют задавать стартовое значение через --filenumber, но в многопроцессной системе всё равно нужен единый источник номеров.
Расширение лучше брать из %C, а не жёстко писать .jpg, если камера может отдавать RAW+JPEG. Тогда один шаблон корректно сохранит оба типа. Если скрипт последующей обработки принимает только JPEG, фильтруйте по фактическому расширению уже после загрузки.
В именах каталогов избегайте символов, которые сложно переносить между системами. gPhoto2 не требует этого, но архив часто позже открывают на Windows, NAS или веб-сервере. Простая схема из латиницы, цифр, дефиса и подчёркивания уменьшает количество побочных проблем.
События камеры и правильная реакция на них
PTP-камера может сообщать не только появление нового файла. В очереди событий встречаются изменения свойств, переключение состояния и служебные уведомления. Поэтому режим ожидания не следует считать «таймером до следующей фотографии». Он слушает то, что выдаёт устройство.
--wait-event подходит, когда нужно наблюдать события без обязательной загрузки. --wait-event-and-download дополнительно получает новые файлы. --capture-tethered предназначен именно для tethered-сценария и по смыслу близок к ожиданию с загрузкой.
gphoto2 --wait-event=5s
gphoto2 --wait-event-and-download=30s
При отладке полезно сначала коротко посмотреть поток событий и только потом запускать бесконечный режим. Если камера вообще не сообщает о нажатии физического затвора, tethering через события не заработает простым увеличением таймаута.
В долгоживущем процессе предусмотрите «тишину». Отсутствие событий несколько минут может быть нормальным, если оператор ничего не снимает. Ошибка — это потеря устройства, отказ протокола или ненулевой код возврата, а не само отсутствие нового кадра.
Фокусировка и Live View в автоматических установках
Удалённая фокусировка — одна из самых зависимых от модели областей. Камера может предоставлять отдельную команду автофокуса, выбор точки, шаг ручного движения объектива или только включение Live View. Всё это определяется через конфигурацию, а не общей опцией «focus» для всех устройств.
Перед разработкой фокус-стекинга сначала проверьте, что объектив и камера позволяют программно двигать фокус в Live View. Затем измерьте, что означает один шаг на вашей связке. У разных объективов одинаковое числовое значение не обязано приводить к одинаковому перемещению плоскости резкости.
Для автофокуса учитывайте логику камеры: удалённый спуск способен отказаться снимать, если фокус не подтверждён. В студии это проявляется как редкие «необъяснимые» пропуски, хотя причина — низкий контраст или темнота. Хороший сценарий отличает ошибку фокусировки от ошибки USB и сообщает оператору правильную причину.
Live View повышает энергопотребление и нагрев. Если экран предпросмотра нужен только перед серией, разумно включать его на время настройки и выключать на длительный интервал. Так уменьшается нагрузка на аккумулятор и матрицу, особенно в многосуточных экспериментах.
RAW+JPEG: как не перепутать экспозицию и файл
В режиме RAW+JPEG один спуск создаёт два объекта, иногда с одинаковой базовой частью имени. gPhoto2 честно обрабатывает оба, поэтому hook с ACTION=download сработает дважды. Если ваша бизнес-логика считает каждый вызов hook новым кадром, статистика удвоится.
Надёжная схема связывает файлы в одну экспозицию по базовому имени, близкой временной метке или метаданным. JPEG можно сразу показать оператору, а RAW поставить в очередь на копирование и архив. При этом завершение JPEG-загрузки ещё не означает, что RAW уже безопасно записан.
--keep-raw полезен, когда на компьютер нужен только JPEG для оперативного просмотра, а тяжёлый RAW остаётся на карте. Но это не заменяет резервное копирование: если карта потеряна до выгрузки, RAW тоже потерян.
Если камера создаёт дополнительные файлы — например, sidecar или отдельные объекты для видео, — сценарий должен обнаруживать их по фактическому списку, а не по предположению «всегда ровно два».
Длительные сессии: питание, сон и тепловой режим
Большинство проблем многодневной съёмки находятся вне gPhoto2. Камера засыпает, аккумулятор разряжается, USB-разъём шевелится, карта заполняется или ОС обновляется и перезапускает сервисы. Командный клиент не может компенсировать физически пропавшее питание.
Для постоянной установки используйте штатный сетевой адаптер или качественную батарею-эмулятор, фиксируйте USB-кабель и отключайте агрессивное энергосбережение USB-хоста только там, где оно действительно мешает. Не стоит отключать все механизмы энергосбережения системы без разбора.
Проверяйте настройку auto power off на самой камере. Некоторые модели не дают полностью отключить сон, но активная PTP-сессия или периодическое обращение удерживает их в рабочем состоянии. Это поведение надо тестировать именно на конкретной прошивке.
Live View и видео сильнее нагревают камеру, чем редкий одиночный кадр. При технической съёмке разумно выключать preview между измерениями. Если производитель ограничивает работу по температуре, программно обходить защиту не следует.
На стороне компьютера полезен watchdog, который отличает три состояния: камера доступна и готова; камера временно занята; камера отсутствует. Реакция должна быть разной. Перезапуск gPhoto2 каждые 100 мс после физического отключения только создаёт шум.
USB-кабели, хабы и физическая надёжность
PTP-ошибки часто ищут в софте, хотя виноват транспорт. Длинный некачественный USB-кабель, переходник или перегруженный хаб способен работать при просмотре одного файла и срываться на серии больших RAW. Поэтому диагностику начинайте с короткого надёжного кабеля и прямого порта.
Камеры потребляют разный ток, а некоторые USB-порты фотоаппарата одновременно используются для зарядки. Активный хаб с отдельным питанием бывает стабильнее пассивного, но он тоже должен качественно распределять полосу и питание. Для нескольких камер желательно понимать топологию USB-контроллеров компьютера.
Разъём на камере — механически уязвимое место. В студии его фиксируют разгрузкой кабеля, чтобы случайный рывок не повредил порт. Никакой retry в скрипте не компенсирует физически шатающийся коннектор.
После замены кабеля повторите тот же минимальный тест, который раньше падал. Не меняйте одновременно кабель, версию libgphoto2, камеру и скрипт: иначе невозможно понять, что именно устранило проблему.
Обновление libgphoto2 ради новой камеры
Новая камера может появиться в libgphoto2 позже, чем в стабильном репозитории дистрибутива. Перед сборкой из исходников сначала сравните текущую версию gphoto2 --version с записью модели в официальном списке поддержки. Если ваша версия уже достаточно новая, обновление не решит проблему, связанную с режимом USB или ограничением камеры.
Важно различать номер gPhoto2 и номер libgphoto2. Командный клиент может быть версии 2.5.32, а библиотека — 2.5.34. Поддержка новых идентификаторов камеры и протокольные исправления чаще относятся именно к библиотеке.
Сборка в /usr/local поверх системных пакетов создаёт риск смешивания библиотек. Команда может запускаться из одного префикса, а загружать camlib из другого. После нестандартной установки всегда проверяйте полный вывод --version и пути библиотек, если поведение кажется нелогичным.
Для рабочей станции лучше иметь воспроизводимый пакет или контейнеризированную сборочную процедуру, чем вручную заменять файлы на каждом компьютере. Но USB-доступ из контейнера требует отдельной настройки и не всегда упрощает жизнь. Выбирайте метод, который команда умеет сопровождать.
Права доступа без постоянного sudo
gPhoto2 не должен требовать root в обычной пользовательской сессии. Современные Linux-системы применяют udev и ACL, чтобы локальный пользователь получил доступ к подключённой камере. Если команда работает только через sudo, стоит исправить правила доступа, а не превращать привилегированный запуск в норму.
Для systemd-сервиса ситуация другая: сервис может работать не от интерактивного пользователя и не получать его ACL. Тогда нужно явно выбрать системного пользователя, группу и udev-правило, соответствующее политике вашей системы. Не делайте USB-устройство доступным всем на запись без необходимости.
После изменения правил переподключите камеру и проверьте права на устройство. Ошибка «could not claim» при этом всё ещё может означать занятость другим процессом, а не запрет прав. Проверяйте обе причины отдельно.
gPhoto2 как системный сервис
В фотобудке или киоске gPhoto2 часто запускается не вручную, а из службы. Есть два подхода. Первый — короткие команды по запросу: сервис получает событие, запускает gPhoto2, снимает кадр и завершается. Второй — долгоживущая PTP-сессия, где процесс постоянно ждёт события.
Короткие команды проще восстанавливаются после ошибок, но каждый запуск заново инициализирует камеру. Долгоживущая сессия быстрее реагирует и лучше для tethering, зато требует аккуратной обработки отключения и повторного подключения. Выбор зависит от частоты съёмки и поведения модели.
В systemd полезны ограниченный Restart, пауза между попытками и отдельный журнал. Не задавайте бесконечный агрессивный restart. После нескольких неудач оператор должен увидеть состояние «камера недоступна», а не только постоянно растущий лог.
Файл настроек gPhoto2 в домашнем каталоге пользователя сервиса может отличаться от вашего интерактивного аккаунта. Если поведение команды «в терминале» и «в сервисе» различается, сравните окружение, HOME, локаль и доступ к USB.
Контроль целостности и резервирование
Факт сообщения «Saving file as…» означает, что gPhoto2 записал объект на диск, но производственный процесс может требовать более строгой проверки. После загрузки можно удостовериться, что файл имеет ненулевой размер, открывается соответствующим декодером и успешно копируется во второе хранилище.
Для критичных съёмок вычисляют контрольную сумму уже на локальном файле и записывают её в журнал. Это не функция gPhoto2, а следующий слой конвейера. При переносе на NAS или облако контрольная сумма помогает доказать, что копия совпадает с локальным исходником.
Удалять файл с карты безопаснее после подтверждения второй копии. Если скорость требует освобождать карту быстро, хотя бы сначала дождитесь завершения записи на SSD и синхронизации файловой системы. Логика «скачал — сразу удалил — потом начал обработку» создаёт единственную точку отказа.
Разделение захвата и обработки
gPhoto2 лучше всего выполняет узкую роль: получить кадр. Ретушь, распознавание, печать и публикация должны быть отдельными этапами. Это не просто архитектурная эстетика. Если конвертер зависнет, камера всё равно должна иметь возможность снять следующий кадр и сохранить его.
Один из устойчивых вариантов — каталог входящих файлов. Hook атомарно передаёт путь очереди, worker обрабатывает копию и кладёт результат в другой каталог. Не изменяйте оригинал на месте, пока не закончено резервирование.
Для фото на документы можно после загрузки вызвать редактор или специализированный модуль; для фотограмметрии — индексировать серию; для лаборатории — запустить анализ OpenCV. gPhoto2 остаётся одинаковым, а последующий конвейер меняется под задачу.
Когда использовать прямой API libgphoto2 вместо CLI
CLI удобен, пока процесс состоит из понятных завершённых операций. Если приложение должно держать соединение часами, получать события в собственном event loop, показывать Live View и менять настройки без запуска внешнего процесса, прямой API libgphoto2 может быть уместнее.
Для Python существуют binding-проекты к libgphoto2; для C библиотека предоставляет нативный API. Но переход к API увеличивает ответственность разработчика: нужно правильно управлять контекстом, камерой, списками файлов, ошибками и освобождением ресурсов.
Хорошая практика — сначала прототипировать конкретную команду через gPhoto2. Если --get-config или --capture-image не работает в CLI, переписывание на API почти никогда не исправит несовместимость драйвера. Сначала добейтесь работы базового протокола, затем меняйте уровень интеграции.
Границы совместимости: PTP, MTP и Mass Storage
libgphoto2 в первую очередь ценна там, где камера общается через PTP, MTP или фирменное расширение протокола. В этом режиме компьютер может не только читать файлы, но и получать свойства устройства и управлять съёмкой, если производитель это допускает.
USB Mass Storage устроен иначе: камера выглядит как диск. Для простого копирования файлов дополнительная библиотека не нужна. Именно поэтому официальный проект не считает поддержку mass-storage-камер своей основной задачей.
PictBridge/PTP-совместимая модель иногда работает через универсальный PTP-класс даже до появления точного имени в таблице. Но «определилась как USB PTP Class Camera» ещё не означает полного удалённого управления. Реальный набор команд показывает только тест.
Как проверять новую камеру перед внедрением
Не начинайте с длинного таймлапса. Сначала выполните короткий приёмочный тест из нескольких этапов. Он занимает минуты и сразу отделяет базовую совместимость от редких проблем.
- Обнаружение после холодного включения камеры.
- Повторное обнаружение после переподключения USB.
- Вывод summary и abilities.
- Чтение нескольких ключевых config-параметров.
- Одиночный захват JPEG.
- Одиночный захват RAW+JPEG, если нужен этот режим.
- Десять последовательных кадров с реальным рабочим интервалом.
- Tethered-кадр с физической кнопки, если он нужен.
- Проверка сна: оставить систему бездействующей дольше штатного таймаута.
- Имитация обрыва USB и восстановление.
Такой тест полезнее абстрактной отметки «камера поддерживается». Он отвечает именно на вопрос, выдержит ли модель ваш процесс и сможет ли оператор восстановить работу без перезагрузки всей системы.
Локаль, вывод и воспроизводимая диагностика
gPhoto2 локализует часть сообщений. Для человека это удобно, для скрипта — риск. Если автоматизация ищет текст ошибки, смена языка системы может её сломать. Там, где возможно, полагайтесь на код возврата и структурированные данные, а диагностику запускайте с LC_ALL=C.
Это же полезно при обращении в сообщество: английский debug-log легче сопоставить с кодом и известными ошибками. Но не меняйте локаль всей системы — достаточно переменной окружения конкретного процесса.
Сохраняйте рядом с логом вывод gphoto2 --version. Ошибка без информации о версиях клиента и библиотеки часто неповторима для другого человека.
Профили съёмки без отдельной системы пресетов
У gPhoto2 нет собственной библиотеки визуальных пресетов камеры, но профиль легко представить как последовательность проверенных set-config. Например, для предметной съёмки можно хранить shell-файл, который выставляет ручной режим, ISO, диафрагму, выдержку, баланс белого и цель сохранения. Ключевое условие — все пути должны быть получены на конкретной модели.
gphoto2 --set-config /main/imgsettings/iso=100
gphoto2 --set-config /main/capturesettings/aperture=8
gphoto2 --set-config /main/capturesettings/shutterspeed=1/125
Не все камеры разрешают менять режим экспозиции программно. Если диск установлен в Av/A, выдержка может быть вычисляемой и доступной только для чтения. Поэтому профиль должен сначала проверять исходный режим или документировать, какое положение органов управления требуется от оператора.
Хороший профиль заканчивается верификацией: повторным --get-config по критичным свойствам. Если хотя бы одно значение не совпало, лучше остановить сессию до первого кадра. Это особенно важно в репродукционной съёмке, где серия должна быть одинаковой по экспозиции и балансу.
Профиль удобно хранить рядом с проектом и версионировать как обычный текст. Тогда изменение ISO или логики именования видно в истории, а новая рабочая станция воспроизводит ту же последовательность без ручного прокликивания меню.
Пример hook-скрипта для быстрой проверки кадра
Hook получает ACTION, а при загрузке — путь через ARGUMENT. Минимальный обработчик может отдельно реагировать на завершение файла и передавать его внешней программе. Важно не предполагать, что hook вызывается только для download.
#!/bin/sh
case "${ACTION:-}" in
init)
mkdir -p /data/incoming
;;
download)
file="${ARGUMENT:-}"
[ -n "$file" ] || exit 1
printf '%sn' "$file" >> /data/incoming/queue.txt
;;
start|stop)
;;
*)
;;
esac
exit 0
В реальной системе простая текстовая очередь подходит не всегда: два процесса могут писать одновременно, а повторный запуск worker — обработать строку дважды. Для серьёзного проекта используйте атомарное перемещение файлов между каталогами, SQLite, Redis или другую очередь, которую команда умеет сопровождать.
Hook не должен удалять исходник сразу после запуска внешней программы. Он знает, что загрузка завершена, но не знает, что последующая обработка успешно создала результат. Удаление или очистка должны быть отдельным подтверждённым этапом.
Синхронизация архива через —new и —skip-existing
Две опции решают разные части задачи. --new опирается на флаг камеры «уже скачано» и поэтому зависит от драйвера. --skip-existing смотрит на локальный каталог и не перезаписывает существующее имя. Их можно сочетать, но ни одна сама по себе не является полноценной системой синхронизации.
Представьте, что вчера файл IMG_0001.JPG был скачан, затем счётчик камеры сбросили и сегодня появилось новое фото с тем же именем. --skip-existing увидит локальный файл и пропустит новый. Значит, структура каталогов и уникальные имена остаются обязательными.
Для архива полезно вести собственный журнал: путь на камере, исходное имя, размер, время скачивания и локальный путь. При повторном подключении можно сравнить список с журналом и решить, какие объекты действительно отсутствуют. Такой подход сложнее одной команды, зато предсказуем при смене карт и сбросе нумерации.
Многокамерный стенд: последовательность вместо хаоса
Если в системе четыре камеры, проектируйте управление как четыре независимых канала. На старте получите список устройств, сопоставьте порт с ожидаемой моделью или серийным номером, затем создайте отдельную очередь для каждой камеры. Команда для Camera A не должна случайно уйти на Camera B после переподключения.
USB-адрес вида usb:001,006 удобен для текущего сеанса, но номер устройства меняется. Для постоянного стенда полезно хранить карту физического порта хаба и дополнительно проверять серийный номер из summary там, где камера его сообщает.
Если нужен почти одновременный спуск, можно запустить несколько процессов, но системный запуск не даст точной аппаратной синхронизации. Для фотограмметрии, bullet-time и измерительных систем используют общий аппаратный триггер, а gPhoto2 занимается настройкой и выгрузкой каждого потока.
При одновременной передаче больших RAW следите за общей полосой USB. Иногда быстрее и стабильнее сначала синхронно снять на карты, а затем выгружать камеры по очереди, чем заставлять все устройства передавать файлы одновременно.
Подготовка камеры к съёмке по расписанию
Cron может запускать gPhoto2 по времени, но простая строка cron не решает проблему состояния оборудования. За час до события камера могла отключиться, сменить режим или быть захвачена файловым менеджером. Поэтому задание по расписанию должно начинаться с самопроверки.
Проверка включает обнаружение, чтение ключевых настроек, наличие места на диске и тест состояния каталога. Если камера не готова, лучше записать ошибку и уведомить оператора, чем создавать пустые файлы или бесконечно повторять команду.
Для точного расписания учитывайте системное время компьютера. Если дата используется в имени файла, синхронизируйте часы NTP или другим доверенным способом. В полевой установке без сети полезны RTC и мониторинг дрейфа.
Когда расписание содержит длительную серию, лучше запускать один процесс с --interval и --frames, чем порождать новый gPhoto2 каждую минуту через cron. Один процесс сохраняет последовательное владение камерой и уменьшает число повторных инициализаций.
Сценарий репродукции документов и предметов
В репродукционной установке камеру обычно закрепляют, свет фиксирован, а параметры должны оставаться неизменными. gPhoto2 удобен тем, что настройку можно превратить в проверяемый скрипт: ISO, диафрагма, выдержка, баланс белого и формат файла читаются перед каждой партией.
Оператор кладёт следующий объект, нажимает аппаратную кнопку или клавишу интерфейса, после чего файл получает имя из номера заказа и кадра. Hook может создать маленький JPEG для контроля резкости, не трогая исходный RAW.
Если камера поддерживает Live View, его можно использовать для первичного кадрирования. Но постоянный Live View не обязателен во время всей партии: после фиксации геометрии его можно выключить, снизив нагрев и нагрузку.
Для документной съёмки особенно полезно запретить автоматические параметры, которые делают серию неоднородной. Однако gPhoto2 не может отменить физическое положение диска камеры или переключатель AF/MF на объективе. Процедура подготовки оборудования остаётся частью рабочего регламента.
Сценарий лабораторного эксперимента
В эксперименте кадр часто должен сопровождаться внешними данными: номером цикла, температурой, положением привода или показанием датчика. gPhoto2 получает изображение, а управляющий скрипт объединяет его с телеметрией по общей временной метке или номеру опыта.
Если внешний контроллер подаёт сигнал, можно использовать ожидание SIGUSR1 в интервальном режиме либо запускать захват из основного процесса. Главное — определить, какая система является источником времени. Файл камеры не должен становиться единственным доказательством момента события, если точность критична.
Для воспроизводимости сохраняйте рядом с данными вывод версии gPhoto2/libgphoto2, конфигурацию камеры и идентификатор прошивки. Через полгода это поможет объяснить, почему повторный эксперимент получил немного другой набор доступных свойств.
Что проверять после обновления системы
Обновление Linux может заменить gPhoto2, libgphoto2, libusb, правила udev и компоненты автомонтирования. Даже если команда запускается, поведение рабочего места может измениться. После обновления проведите короткий regression-тест до следующей ответственной съёмки.
- Сравните
gphoto2 --versionс сохранённым выводом. - Проверьте обнаружение и права обычного пользователя.
- Проверьте один захват и загрузку RAW+JPEG.
- Проверьте tethered-событие с кнопки камеры.
- Проверьте hook и шаблон имени.
- Убедитесь, что файловый менеджер снова не стал автоматически захватывать устройство.
Такой регламент особенно важен для киосков и лабораторий, где систему обновляют централизованно и оператор не знает, какие пакеты изменились.
Восстановление после обрыва связи
Надёжная система должна считать USB-обрыв ожидаемым отказом, а не исключительной катастрофой. Кабель могут задеть, камера может перезагрузиться после замены питания, а хаб — кратковременно сбросить устройство. После этого старый адрес usb:BBB,DDD способен стать недействительным.
Не продолжайте слепо отправлять команды на сохранённый порт. Завершите текущую операцию, снова выполните --auto-detect, идентифицируйте нужную камеру и только затем восстановите рабочие настройки. Если сценарий меняет ISO, capturetarget или Live View, эти значения тоже надо проверить: после перезагрузки камера могла вернуться к пользовательским настройкам.
Скачивание файла, оборванное посередине, следует считать неуспешным, даже если локальное имя уже появилось. Записывайте загрузку во временное имя и только после успешного завершения переводите файл в «готовый» каталог. Это защищает downstream-процесс от чтения недописанного RAW.
Если на карте остался кадр, созданный перед обрывом, после повторного подключения его можно обнаружить через список файлов и скачать отдельно. Поэтому полезно хранить последний подтверждённый исходный идентификатор камеры или имя файла. Для SDRAM-захвата такой шанс может отсутствовать: временный объект зависит от сессии.
После нескольких неудачных попыток восстановления автоматике лучше остановиться и запросить вмешательство. Бесконечный цикл reset/reconnect может мешать оператору и скрывать реальную аппаратную проблему.
Как фиксировать конфигурацию для повторяемой съёмки
Команда --list-all-config в поддерживающих её версиях позволяет получить расширенный список конфигурационных значений, а связка --list-config и --get-config подходит для собственного экспорта. Для повторяемой установки полезно сохранять снимок конфигурации перед серией.
Не все строки из такого снимка можно потом бездумно «воспроизвести». В списке есть read-only свойства, состояния батареи, серийные номера и параметры, значение которых имеет смысл только в конкретном режиме. Поэтому конфигурационный профиль должен включать только те настройки, которыми вы осознанно управляете.
Хороший файл профиля содержит ожидаемую модель камеры, обязательные параметры и допустимые варианты. При запуске скрипт сначала проверяет модель, затем наличие каждого параметра, а уже после этого задаёт значения. Так случайно подключённая другая камера не получит набор команд, рассчитанный на совершенно иной драйвер.
Если проект длится месяцы, сохраняйте также версию прошивки камеры. Производитель может изменить PTP-поведение обновлением firmware. Это редкая, но реальная причина того, что тот же компьютер и тот же gPhoto2 начинают иначе видеть свойства.
Минимальный тест перед ответственной съёмкой
За несколько минут до начала сессии полезно выполнить короткую процедуру. Она не заменяет полный приёмочный тест, но ловит наиболее частые бытовые проблемы.
- Проверить питание камеры и фиксацию USB.
- Закрыть программу импорта и убедиться, что камера не смонтирована файловым менеджером.
- Выполнить
--auto-detectи сверить модель. - Запросить ключевые значения через
--get-config. - Сделать тестовый JPEG и убедиться, что он появился в правильном каталоге.
- Проверить уникальность шаблона имени.
- Если используется RAW+JPEG — убедиться, что приходят оба объекта.
- Если используется tethering — нажать физический затвор и проверить автоматическую загрузку.
- Открыть полученный файл в просмотрщике, а не ограничиваться наличием имени на диске.
Эта процедура кажется избыточной только до первого случая, когда камера осталась в другом режиме после предыдущего оператора или рабочий стол незаметно захватил PTP-сеанс. Для повторяемой работы короткий preflight экономит больше времени, чем последующая диагностика серии.
Сравнение с аналогами
gPhoto2 разумно сравнивать не только с программами редактирования, но прежде всего с инструментами tethered-съёмки. ФотоМАСТЕР выполняет другую роль: он обрабатывает уже полученные фотографии. Поэтому сравнение показывает границу задач, а не попытку выбрать один универсальный продукт.
| Программа | Основная задача | Сильные стороны | Ограничения относительно gPhoto2 |
|---|---|---|---|
| gPhoto2 | Управление камерами и автоматизация съёмки | CLI, скрипты, события, конфигурация, перенос файлов | Нет штатного полноценного GUI и встроенного фоторедактора |
| ФотоМАСТЕР | Обработка готовых фотографий | Пакетная обработка, ретушь, удаление объектов, замена и размытие фона | Не является средством PTP/tethered-управления камерой |
| Entangle | Графическая tethered-съёмка на Linux | Live preview, спуск, автоматическая загрузка, настройка камеры, цветоуправляемый просмотр | Меньше ориентирован на командные конвейеры и headless-автоматизацию |
| digiCamControl | Tethered-съёмка с графическим интерфейсом | Live View, таймлапс, брекетинг, фокус-стекинг, сессии и web-управление | Ориентирован на Windows и собственную среду работы |
| darktable | Каталогизация, RAW-обработка и tethering | Съёмка в связке с последующей обработкой RAW | Тяжелее как простой исполнитель команд и системный компонент |
gPhoto2 и ФотоМАСТЕР
ФотоМАСТЕР нужен после съёмки: официально у него есть пакетная обработка, ретушь, удаление лишних объектов, коррекция цвета, кадрирование, замена или размытие фона и другие инструменты обработки. gPhoto2 не делает такой ретуши. Его задача — получить файл из камеры и управлять тем, как этот файл создаётся.
В реальном процессе программы могут быть последовательными, а не конкурирующими: gPhoto2 снимает и скачивает серию, затем фотографии открываются в редакторе для коррекции и экспорта. Если же задача целиком состоит в улучшении уже имеющихся снимков, gPhoto2 не даёт преимуществ — камера вообще может не участвовать.
gPhoto2 и Entangle
Entangle построен поверх libgphoto2 и предоставляет графический интерфейс для tethered-съёмки. Он удобнее, если фотографу нужен живой предпросмотр, крупное изображение снятого кадра и доступ к настройкам мышью. gPhoto2 выигрывает там, где управление должно быть без монитора, через скрипт, SSH или встраивание в другой сервис.
gPhoto2 и digiCamControl
digiCamControl предлагает законченную студийную оболочку: Live View, управление экспозицией, брекетинг, таймлапс, несколько камер, web-интерфейс и инструменты фокусировки на поддерживаемых моделях. gPhoto2 менее «готов» для фотографа, зато его командная модель легче становится частью Linux-автоматизации и не требует держать большое GUI-приложение.
gPhoto2 и darktable
darktable сочетает tethering с каталогом и RAW-обработкой. Если после спуска нужно сразу оценивать и проявлять RAW в одном приложении, это сильная связка. Если нужна только команда «снять, получить файл, передать в мой конвейер», gPhoto2 проще и предсказуемее как низкоуровневый компонент.
Кому gPhoto2 подходит лучше всего
Программа особенно уместна в задачах, где интерфейс важен меньше, чем автоматизация:
- tethered-съёмка с автоматической загрузкой кадров;
- таймлапс на Linux или Raspberry Pi;
- фотобудка с собственным пользовательским интерфейсом;
- предметная и лабораторная съёмка по внешнему триггеру;
- управление камерой по SSH без рабочего стола;
- передача кадров в OpenCV, FFmpeg, RAW-конвертер или сервер;
- многокамерные установки, где каждым устройством управляет отдельный процесс.
Если пользователю нужен только визуальный tethering с большим Live View и кнопками, проще начать с Entangle или digiCamControl. Если нужен фоторедактор, выбирают ФотоМАСТЕР, darktable или другой редактор. gPhoto2 ценен именно тем, что не навязывает собственную рабочую среду.
Ограничения, которые важно принять заранее
Первое ограничение — зависимость от конкретной камеры. Нельзя составить один универсальный набор set-config и применять его ко всем моделям. Даже похожие камеры могут иметь разные названия свойств и разные ограничения.
Второе — отсутствие штатного полноценного графического интерфейса у самого gPhoto2. Это плюс для автоматизации, но минус для пользователя, которому нужен визуальный рабочий стол. GUI-фронтенды существуют отдельно и используют ту же libgphoto2.
Третье — PTP-сеанс чувствителен к конкурирующим программам. Автомонтирование, фирменный импортер и второй экземпляр gPhoto2 могут заблокировать устройство.
Четвёртое — Live View через preview не равен UVC-веб-камере и не гарантирует низкую задержку. Для видео реального времени специализированное оборудование часто лучше.
Пятое — gPhoto2 не выполняет художественную обработку. Он может передать RAW, но проявлять, ретушировать и готовить к печати нужно другим инструментом.
Частые вопросы
Можно ли снимать без карты памяти?
Зависит от камеры. Некоторые модели умеют захват в SDRAM и немедленную передачу на компьютер, другим нужна вставленная карта. Проверяйте свойства capturetarget и документацию конкретного драйвера.
Можно ли управлять ISO и диафрагмой?
Да, если камера и драйвер предоставляют эти параметры. Сначала выполните --list-config, затем --get-config для нужного свойства. Наличие общего флага в чужом примере ничего не гарантирует.
Можно ли использовать gPhoto2 как веб-камеру?
Напрямую это не UVC-драйвер. На поддерживаемых камерах можно получить поток preview и передать его в v4l2loopback или медиаконвейер. Задержка и частота кадров зависят от модели.
Почему камера видна файловому менеджеру, но gPhoto2 выдаёт ошибку?
Потому что файловый менеджер уже открыл PTP-сеанс. Размонтируйте камеру и закройте программы импорта.
Поддерживается ли Windows?
Основной практический сценарий gPhoto2 — Unix-подобные системы. Если нужен готовый Windows-интерфейс для tethering, обычно удобнее специализированная программа вроде digiCamControl или фирменной утилиты производителя.
Можно ли оставить RAW на карте, а JPEG скачивать?
В подходящем сценарии используйте --keep-raw. Оно предназначено для dual-mode съёмки, но поведение надо проверить на вашей камере.
Как понять, что проблема именно в версии libgphoto2?
Сравните gphoto2 --version и официальный список поддержки. Новая камера может требовать libgphoto2 новее той, что поставляется со старым дистрибутивом. Не путайте версию клиента gPhoto2 с версией библиотеки.
Итоговый рабочий чек-лист
- Проверить, что камера работает в подходящем USB-режиме и не захвачена другой программой.
- Выполнить
gphoto2 --auto-detect, затем--summaryи--abilities. - Сохранить вывод
--list-configдля конкретной модели. - Проверить один одиночный
--capture-image-and-download. - Определить, нужна ли копия на карте, и выбрать
--keep,--no-keepили--keep-raw. - Задать уникальный шаблон
--filename. - Для студии проверить
--capture-tethered, для таймлапса —--intervalи--frames. - Добавить hook только после того, как базовый захват стабилен.
- При ошибке сначала исключить конкурирующие процессы и только затем собирать debug-лог.
- Не удалять исходники с карты до подтверждённой резервной копии.
gPhoto2 хорошо работает как технический слой между камерой и собственным процессом пользователя. Чем точнее известны возможности конкретной модели и чем аккуратнее выстроено владение USB-сеансом, тем надёжнее программа ведёт себя в студии, фотобудке, таймлапсе и автоматизированной установке.
