Skip to content

About

LiveTether turns a USB-connected Panasonic LUMIX camera into a webcam on macOS 14.1 and later. Not affiliated with Panasonic.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

43 Commits

Folders and files

Repository files navigation

LiveTether app icon

LiveTether

A webcam for Panasonic LUMIX cameras on macOS

LiveTether turns the live view of a Panasonic LUMIX camera connected over USB into a webcam on macOS 14.1 and later. Any app that uses a camera can choose it: FaceTime, QuickTime Player, OBS, web browsers and video-conferencing apps.

The picture is the camera's live view, the small monitor image a camera sends over USB for remote shooting, not its recorded video. It is softer than a webcam picture should be; for the camera's full video quality, use its HDMI output with a capture device (see Limitations).

Panasonic's LUMIX Webcam Software does not support macOS 14.1 and later. LiveTether is a separate app built on Apple's Core Media I/O camera extension API.

LiveTether is an independent project. It is not made, endorsed or supported by Panasonic. LUMIX and Panasonic are trademarks or registered trademarks of Panasonic Holdings Corporation and are used here only to name the cameras this app works with. All other trademarks belong to their respective owners.

How it works

  • The menu bar app finds the camera through ImageCaptureCore and opens a PTP session with it. While an app is using LiveTether, it turns on the camera's live view, fetches JPEG frames at up to 30 fps, decodes them and passes them to the camera extension. When no app is using LUMIX Webcam, it turns live view off.
  • The camera extension publishes a camera named LiveTether with 1920 × 1080, 1280 × 720 and 1280 × 960 formats at 30 fps. It fits the camera picture into the format the app chose, with black bars where the aspect ratios differ. While no camera picture arrives, it shows a standby screen that says why.
  • With Auto Framing on, the app finds the people in each picture and crops the picture around them, following them smoothly as they move. The eyes sit in the upper third of the picture, and a face turned to one side gets extra room on that side. People are found in a small grayscale copy of the picture, on this Mac only; no picture is stored or sent.

The app sends the camera only the commands live view needs: open and close a session, read and set the live-view size, turn live view on and off, and fetch live-view frames. These Panasonic PTP operations and their parameters are documented in the open-source libgphoto2 project (camlibs/ptp2/ptp.h). The app never sends commands that change camera settings, format a card or update firmware.

Limitations

LiveTether can only pass on what the camera sends over USB, and over USB a LUMIX camera sends its live view, not its recorded video:

  • The camera sets the largest live-view size. A DC-GH6 offers 640 × 480, 960 × 720 and 1280 × 960 at 30 fps, and each frame is a heavily compressed JPEG. Scaled to 1080p, the picture is soft, so it falls short of what a webcam is expected to deliver.
  • The picture has the camera's current framing and aspect ratio. In a photo mode it is the photo aspect ratio (3:2, for example) with black bars around it; in a video mode it is the video framing.
  • Display aids the camera shows on its monitor, such as the zebra pattern, are part of the picture. Turn them off on the camera.
  • The camera has no USB webcam mode to fall back on: a DC-GH6 offers only PC(Storage), PC(Tether) and PictBridge(PTP).

For the camera's full video quality, connect its HDMI output to a USB HDMI capture device. macOS shows the capture device as a camera of its own, so video apps can choose it directly without LiveTether; Auto Framing then does not apply. Put the camera in a video mode and turn off the information display on the HDMI output. A DC-GH6 keeps its HDMI output while it is connected in PC(Tether) mode, so the USB and HDMI connections can be used at the same time.

Requirements

  • macOS 14.1 or later
  • A LUMIX camera that supports USB tethering, and a USB cable. Connect the camera directly, not through a USB hub or a charge-only port.

Set up

  1. Download the installer (LiveTether-<version>.pkg) from Releases and open it. The installer puts LiveTether in the Applications folder and opens it. A camera icon appears in the menu bar, and the setup guide opens.
  2. Click Install in the setup guide, then allow LiveTether in System Settings > General > Login Items & Extensions > Camera Extensions.
  3. Set the camera's USB mode to PC (Tether) and connect it to the Mac.
  4. In the app you want to use, choose LiveTether as the camera.

The setup guide

The menu bar icon opens a menu with the camera status, Auto Framing, the settings window and the setup guide.

The menu bar menu

Tab Settings
General Install or uninstall the camera extension, open LiveTether at login
Camera The live-view size the camera sends (Automatic picks the largest size at 30 fps), Auto Framing and its shot (head and shoulders, or upper body), frame statistics
Advanced The USB product IDs of the cameras LiveTether uses (default 0x2382)

The General settings tab The Camera settings tab The Advanced settings tab

If the camera is connected but LiveTether does not find it, look up the camera's product ID in System Information > USB and add it on the Advanced tab.

If LiveTether does not appear as a camera in other apps after an update, the General tab shows that a restart is needed. Restart the Mac, or click Reinstall and allow the extension again in System Settings.

To remove LiveTether, click Uninstall on the General tab, then delete the app.

Build

Building needs Xcode 26 (Swift 6.2) and XcodeGen.

xcodegen generate
xcodebuild -project LiveTether.xcodeproj -scheme LiveTether -configuration Release \
  -derivedDataPath build/DerivedData.noindex -allowProvisioningUpdates build

A camera extension only loads when the app and the extension are signed, and the app can only install it while it runs from the Applications folder. To build under your own Apple developer team, set DEVELOPMENT_TEAM in project.yml, change bundleIdPrefix there, and change ExtensionInstaller.extensionIdentifier in App/ExtensionInstaller.swift to match.

Installer

scripts/make-installer.sh turns a signed and notarized LiveTether.app into an installer package that puts the app in the Applications folder and opens it. Signing the package needs a Developer ID Installer certificate, and notarizing it needs a notarytool keychain profile:

scripts/make-installer.sh LiveTether.app LiveTether-<version>.pkg \
  --sign "Developer ID Installer: <name> (<team>)" --notarize <profile>

App icon

The app icon is drawn by a script; run it again after changing the drawing:

swift scripts/make-app-icon.swift App/Assets.xcassets/AppIcon.appiconset

Test

cd Packages/LumixKit && swift test
python3 scripts/check-localization.py

scripts/check-window-layout.swift opens the setup guide and every settings tab of a built app in English, Korean and Japanese, and reports text cut short with an ellipsis, content that scrolls, and windows taller than the screen. Quit LiveTether first. The check brings the app's windows to the front for about ten seconds per language, and the terminal needs the Accessibility and Screen Recording permissions. --screenshots <directory> also saves each window as a screenshot.

swift scripts/check-window-layout.swift "build/DerivedData.noindex/Build/Products/Release/LiveTether.app"

lumix-sink-probe checks the camera extension without a camera. Quit LiveTether first, because only one program can feed the extension at a time, then run:

cd Packages/LumixKit && swift run lumix-sink-probe 30 1280 960

It feeds a moving test pattern of the given size to the extension for the given number of seconds. Choose LiveTether in a camera app to see it.

lumix-framing-probe runs Auto Framing over a video file with people in it, using the same detector, framer and cropper as the app. It prints how often people were found, how long a detection takes and how far the crop moved, and feeds the framed picture to the extension unless --no-sink is given:

cd Packages/LumixKit && swift run lumix-framing-probe ~/Movies/people.mov

Repository layout

Path Contents
App/ The menu bar app: settings, setup guide, extension installer, app icon
CameraExtension/ The Core Media I/O camera extension
Packages/LumixKit/Sources/LumixProtocol/ PTP containers and the Panasonic live-view messages
Packages/LumixKit/Sources/LumixSession/ The camera session, the link state machine and reconnection
Packages/LumixKit/Sources/LumixImageCapture/ The ImageCaptureCore transport and camera discovery
Packages/LumixKit/Sources/LumixVideo/ JPEG decoding, letterboxing, the standby screen and Auto Framing
Packages/LumixKit/Sources/LumixVirtualCamera/ The frame and status channels between the app and the extension
Packages/LumixKit/Tools/SinkProbe/ lumix-sink-probe
Packages/LumixKit/Tools/FramingProbe/ lumix-framing-probe
scripts/check-localization.py The localization check
scripts/check-window-layout.swift The window layout check
scripts/make-app-icon.swift The app icon drawing
scripts/make-installer.sh, scripts/package/ The installer package and its install scripts
.github/images/ The screenshots in this file

Localization

LiveTether is written in English and translated into Korean and Japanese. Each ko.lproj and ja.lproj string table must hold exactly the keys of its English table, with the same format specifiers, and every localized string in the app's Swift sources must have an English entry. scripts/check-localization.py checks both.

Trademarks

LUMIX and Panasonic are trademarks or registered trademarks of Panasonic Holdings Corporation. LiveTether is not affiliated with, endorsed by or supported by Panasonic.

About

LiveTether turns a USB-connected Panasonic LUMIX camera into a webcam on macOS 14.1 and later. Not affiliated with Panasonic.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages