gopro / OpenGoPro

An open source interface specification to communicate with a GoPro camera with accompanying demos and tutorials.
https://gopro.github.io/OpenGoPro/
MIT License
706 stars 152 forks source link

Add Protune settings #561

Open hankzoid opened 4 months ago

hankzoid commented 4 months ago

I've built camera arrays using DSLRs and am looking to build one using 16-20 GoPros controlled via USB. I bought a Hero 12 to have a play with but have just realised it's not possible to control any of the protune settings - shutter speed, iso range, white balance etc. Obviously it's essential that all exposures match in a camera array so unfortunately I can't take this any further for now, unless I'm missing something?

I've seen that adding shutter speed was mentioned a couple of years ago. This seems like a no brainer so I'm sure there's a reason why it hasn't been added yet. Ideally I'd be able to set the white balance and shutter speed, and fix the ISO (or set the min and max range to the same value).

I'll keep an eye out for updates but if there are no plans to add this please let me know.

tcamise-gpsw commented 4 months ago

Yeah unfortunately this is currently blocked due to non-technical reasons. I'm going to use this ticket as the main ticket to track any similar requests.

pavlosharhan2 commented 3 months ago

I have no isues in setting protune settings on GoPro 10/11/12 since year 2021. It's even mentioned in the docs: https://gopro.github.io/OpenGoPro/ble/features/control.html#set-shutter

For example, the list of protune settings I'm able to set:

        "2" to "resolution",
        "3" to "fps",
        "145" to "shutter_speed",
        "102" to "iso_min",
        "13" to "iso_max",
        "115" to "white_balance",
        "116" to "color",
        "117" to "sharpness",
        "118" to "exposure",
        "121" to "lens",
        "124" to "bitrate",
        "88" to "lcd_brightness",

        And available options for each setting:

        val resolutionOptions = TwoWayDict(
        1 to "4K",
        4 to "2.7K",
        6 to "2.7K4:3",
        7 to "1440",
        9 to "1080p",
        18 to "4K4:3",
        24 to "5K",
        25 to "5K4:3",
        100 to "5.3K"
    )

    private val fpsOptions = TwoWayDict(
        0 to "240",
        1 to "120",
        2 to "100",
        5 to "60",
        6 to "50",
        8 to "30",
        9 to "25",
        10 to "24",
        13 to "200"
    )

    private val shutterOptions = TwoWayDict(
        0 to "Auto",
        3 to "1/24",
        4 to "1/25",
        5 to "1/30",
        6 to "1/48",
        7 to "1/50",
        8 to "1/60",
        11 to "1/96",
        12 to "1/100",
        13 to "1/120",
        16 to "1/192",
        17 to "1/200",
        18 to "1/240",
        25 to "1/384",
        21 to "1/400",
        22 to "1/480",
        28 to "1/800",
        23 to "1/960",
        29 to "1/1600",
        24 to "1/1920",
        30 to "1/3200",
        31 to "1/3840"
    )

    private val isoMinOptions = TwoWayDict(
        0 to "6400",
        3 to "3200",
        1 to "1600",
        4 to "800",
        2 to "400",
        7 to "200",
        8 to "100"
    )

    private val isoMaxOptions = TwoWayDict(
        0 to "6400",
        3 to "3200",
        1 to "1600",
        4 to "800",
        2 to "400",
        7 to "200",
        8 to "100"
    )

    private val whiteBalanceOptions = TwoWayDict(
        3 to "6500K",
        7 to "6000K",
        2 to "5500K",
        12 to "5000K",
        11 to "4500K",
        0 to "Auto",
        4 to "Native",
        5 to "4000K",
        10 to "3200K",
        9 to "2800K",
        8 to "2300K"
    )

    private val colorOptions = TwoWayDict(
        1 to "Flat",
        2 to "Natural",
        100 to "Vibrant"
    )

    private val lensOptions = TwoWayDict(
        7 to "Max SuperView",
        3 to "SuperView",
        0 to "Wide",
        4 to "Linear",
        8 to "Linear Horizon Leveling",
        2 to "Narrow"
    )

    private val sharpnessOptions = TwoWayDict(
        0 to "High",
        1 to "Medium",
        2 to "Low"
    )

    private val exposureOptions = TwoWayDict(
        8 to "-2.0",
        7 to "-1.5",
        6 to "-1.0",
        5 to "-0.5",
        4 to "0.0",
        3 to "0.5",
        2 to "1.0",
        1 to "1.5",
        0 to "2.0"
    )

    private val bitrateOptions = TwoWayDict(
        1 to "High",
        100 to "Standard"
    )

    private val lcdBrightnessOptions = TwoWayDict(
        10 to "10%",
        20 to "20%",
        30 to "30%",
        40 to "40%",
        50 to "50%",
        60 to "60%",
        70 to "70%",
        80 to "80%",
        90 to "90%",
        100 to "100%"
    )
hankzoid commented 3 months ago

Thank you for this. I was really hoping I was wrong, but I can't see how to set these? The link that you provided refers to triggering the shutter to take a photo or start/stop recording, rather than changing the shutter speed.

I've tried using http requests and the values that you've posted, but I get a 404 error when trying to set the shutter speed. I get a 200 response when setting the auto power off time using the same process. Changing any of the Protune settings are also not mentioned here - https://gopro.github.io/OpenGoPro/http#tag/settings/operation/GPCAMERA_CHANGE_SETTING::59

For example -

url = "http://172.{camera_url}:8080/gopro/camera/setting"
querystring = {"option":"4","setting":"59"}      # (Auto Power Down -> 5 mins)
response = requests.request("GET", url, params=querystring)
print(response)

returns 200 and correctly changes the Auto Power Down value. However -

url = "http://172.{camera_url}:8080/gopro/camera/setting"
querystring = {"option":"12","setting":"145"}      # (Shutter Speed -> 1/100)
response = requests.request("GET", url, params=querystring)
print(response)

returns 404 error

If you could let me know how you're changing these settings I'd really appreciate it, ideally over USB/WiFi

hankzoid commented 3 months ago

Ok interesting, I can set the shutter speed this way in video mode but not photo mode, I guess because there are different shutter options for video and photo e.g. 1/120 for video, 1/125 for photo. Where did you find this info for the shutter speed options?

pavlosharhan2 commented 3 months ago

Ok interesting, I can set the shutter speed this way in video mode but not photo mode, I guess because there are different shutter options for video and photo e.g. 1/120 for video, 1/125 for photo. Where did you find this info for the shutter speed options?

The shutter speed should be a multiple of the FPS. You can't set 1/100 for 60 FPS. Your options are: 1/60 1/120 1/240 1/480 etc.

1/100 would be possible if you set anti-flicker to 50 Hz first (https://gopro.github.io/OpenGoPro/http#tag/settings/operation/GPCAMERA_CHANGE_SETTING::134), which would allow you to set FPS to 25/50/100. In this case, you could use a 1/100 shutter speed.

Another important thing: ensure Protune is on before setting the settings. For example, you can always call "gp/gpControl/setting/114/1" before applying any settings