diff --git a/docker/main/Dockerfile b/docker/main/Dockerfile index 9d2f442f0..ef4d82f3a 100644 --- a/docker/main/Dockerfile +++ b/docker/main/Dockerfile @@ -215,7 +215,6 @@ ENV TRANSFORMERS_NO_ADVISORY_WARNINGS=1 ENV OPENCV_FFMPEG_LOGLEVEL=8 ENV PATH="/usr/local/go2rtc/bin:/usr/local/tempio/bin:/usr/local/nginx/sbin:${PATH}" -ENV LIBAVFORMAT_VERSION_MAJOR=60 # Install dependencies RUN --mount=type=bind,source=docker/main/install_deps.sh,target=/deps/install_deps.sh \ diff --git a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run index eacce294f..78b4ea547 100755 --- a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run +++ b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run @@ -42,8 +42,14 @@ function migrate_db_path() { fi } +function set_libva_version() { + local ffmpeg_path=$(python3 docker/main/rootfs/usr/local/ffmpeg/get_ffmpeg_path.py) + export LIBAVFORMAT_VERSION_MAJOR=$($ffmpeg_path -version | grep -Po "libavformat\W+\K\d+") +} + echo "[INFO] Preparing Frigate..." migrate_db_path +set_libva_version echo "[INFO] Starting Frigate..." cd /opt/frigate || echo "[ERROR] Failed to change working directory to /opt/frigate" diff --git a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run index 9c4922d81..90c26ceff 100755 --- a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run +++ b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run @@ -43,6 +43,11 @@ function get_ip_and_port_from_supervisor() { export FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL="${ip_address}:${webrtc_port}" } +function set_libva_version() { + local ffmpeg_path=$(python3 /usr/local/ffmpeg/get_ffmpeg_path.py) + export LIBAVFORMAT_VERSION_MAJOR=$($ffmpeg_path -version | grep -Po "libavformat\W+\K\d+") +} + if [[ -f "/dev/shm/go2rtc.yaml" ]]; then echo "[INFO] Removing stale config from last run..." rm /dev/shm/go2rtc.yaml @@ -61,6 +66,8 @@ else echo "[WARNING] Unable to remove existing go2rtc config. Changes made to your frigate config file may not be recognized. Please remove the /dev/shm/go2rtc.yaml from your docker host manually." fi +set_libva_version + readonly config_path="/config" if [[ -x "${config_path}/go2rtc" ]]; then diff --git a/docker/main/rootfs/usr/local/ffmpeg/get_ffmpeg_path.py b/docker/main/rootfs/usr/local/ffmpeg/get_ffmpeg_path.py new file mode 100644 index 000000000..27034bff9 --- /dev/null +++ b/docker/main/rootfs/usr/local/ffmpeg/get_ffmpeg_path.py @@ -0,0 +1,45 @@ +import json +import os +import shutil +import sys + +from ruamel.yaml import YAML + +sys.path.insert(0, "/opt/frigate") +from frigate.const import ( + DEFAULT_FFMPEG_VERSION, + INCLUDED_FFMPEG_VERSIONS, +) + +sys.path.remove("/opt/frigate") + +yaml = YAML() + +config_file = os.environ.get("CONFIG_FILE", "/config/config.yml") + +# Check if we can use .yaml instead of .yml +config_file_yaml = config_file.replace(".yml", ".yaml") +if os.path.isfile(config_file_yaml): + config_file = config_file_yaml + +try: + with open(config_file) as f: + raw_config = f.read() + + if config_file.endswith((".yaml", ".yml")): + config: dict[str, any] = yaml.load(raw_config) + elif config_file.endswith(".json"): + config: dict[str, any] = json.loads(raw_config) +except FileNotFoundError: + config: dict[str, any] = {} + +path = config.get("ffmpeg", {}).get("path", "default") +if path == "default": + if shutil.which("ffmpeg") is None: + print(f"/usr/lib/ffmpeg/{DEFAULT_FFMPEG_VERSION}/bin/ffmpeg") + else: + print("ffmpeg") +elif path in INCLUDED_FFMPEG_VERSIONS: + print(f"/usr/lib/ffmpeg/{path}/bin/ffmpeg") +else: + print(f"{path}/bin/ffmpeg") diff --git a/docker/rpi/Dockerfile b/docker/rpi/Dockerfile index 9860e65ec..581ca7ff8 100644 --- a/docker/rpi/Dockerfile +++ b/docker/rpi/Dockerfile @@ -12,7 +12,5 @@ RUN rm -rf /usr/lib/btbn-ffmpeg/ RUN --mount=type=bind,source=docker/rpi/install_deps.sh,target=/deps/install_deps.sh \ /deps/install_deps.sh -ENV LIBAVFORMAT_VERSION_MAJOR=58 - WORKDIR /opt/frigate/ COPY --from=rootfs / /