mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-04 02:05:21 +03:00
Add audio encoding field and simplify stream creation
This commit is contained in:
parent
878b2364a3
commit
1b5b4219c7
@ -524,16 +524,26 @@ class JsmpegStreamConfig(FrigateBaseModel):
|
|||||||
quality: int = Field(default=8, ge=1, le=31, title="Live camera view quality.")
|
quality: int = Field(default=8, ge=1, le=31, title="Live camera view quality.")
|
||||||
|
|
||||||
|
|
||||||
class RestreamCodecEnum(str, Enum):
|
class RestreamVideoCodecEnum(str, Enum):
|
||||||
copy = "copy"
|
copy = "copy"
|
||||||
h264 = "h264"
|
h264 = "h264"
|
||||||
h265 = "h265"
|
h265 = "h265"
|
||||||
|
|
||||||
|
|
||||||
|
class RestreamAudioCodecEnum(str, Enum):
|
||||||
|
aac = "aac"
|
||||||
|
copy = "copy"
|
||||||
|
opus = "opus"
|
||||||
|
|
||||||
|
|
||||||
class RestreamConfig(FrigateBaseModel):
|
class RestreamConfig(FrigateBaseModel):
|
||||||
enabled: bool = Field(default=True, title="Restreaming enabled.")
|
enabled: bool = Field(default=True, title="Restreaming enabled.")
|
||||||
video_encoding: RestreamCodecEnum = Field(
|
audio_encoding: list[RestreamAudioCodecEnum] = Field(
|
||||||
default=RestreamCodecEnum.copy, title="Method for encoding the restream."
|
default=[RestreamAudioCodecEnum.aac, RestreamAudioCodecEnum.opus],
|
||||||
|
title="Codecs to supply for audio.",
|
||||||
|
)
|
||||||
|
video_encoding: RestreamVideoCodecEnum = Field(
|
||||||
|
default=RestreamVideoCodecEnum.copy, title="Method for encoding the restream."
|
||||||
)
|
)
|
||||||
force_audio: bool = Field(
|
force_audio: bool = Field(
|
||||||
default=True, title="Force audio compatibility with the browser."
|
default=True, title="Force audio compatibility with the browser."
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import requests
|
|||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from frigate.config import FrigateConfig, RestreamCodecEnum
|
from frigate.config import FrigateConfig, RestreamAudioCodecEnum, RestreamVideoCodecEnum
|
||||||
from frigate.const import BIRDSEYE_PIPE
|
from frigate.const import BIRDSEYE_PIPE
|
||||||
from frigate.ffmpeg_presets import (
|
from frigate.ffmpeg_presets import (
|
||||||
parse_preset_hardware_acceleration_encode,
|
parse_preset_hardware_acceleration_encode,
|
||||||
@ -18,18 +18,26 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
def get_manual_go2rtc_stream(
|
def get_manual_go2rtc_stream(
|
||||||
camera_url: str, codec: RestreamCodecEnum, engine: Optional[str]
|
camera_url: str,
|
||||||
|
aCodecs: list[RestreamAudioCodecEnum],
|
||||||
|
vCodec: RestreamVideoCodecEnum,
|
||||||
|
engine: Optional[str],
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Get a manual stream for go2rtc."""
|
"""Get a manual stream for go2rtc."""
|
||||||
if codec == RestreamCodecEnum.copy:
|
stream = f"ffmpeg:{camera_url}"
|
||||||
return f"ffmpeg:{camera_url}#video=copy#audio=aac#audio=opus"
|
|
||||||
|
for aCodec in aCodecs:
|
||||||
|
stream += f"#audio={aCodec}"
|
||||||
|
|
||||||
|
if vCodec == RestreamVideoCodecEnum.copy:
|
||||||
|
stream += "#video=copy"
|
||||||
|
else:
|
||||||
|
stream += f"#video={vCodec}"
|
||||||
|
|
||||||
if engine:
|
if engine:
|
||||||
return (
|
stream += f"#hardware={engine}"
|
||||||
f"ffmpeg:{camera_url}#video={codec}#hardware={engine}#audio=aac#audio=opus"
|
|
||||||
)
|
|
||||||
|
|
||||||
return f"ffmpeg:{camera_url}#video={codec}#audio=aac#audio=opus"
|
return stream
|
||||||
|
|
||||||
|
|
||||||
class RestreamApi:
|
class RestreamApi:
|
||||||
@ -48,10 +56,11 @@ class RestreamApi:
|
|||||||
|
|
||||||
for input in camera.ffmpeg.inputs:
|
for input in camera.ffmpeg.inputs:
|
||||||
if "restream" in input.roles:
|
if "restream" in input.roles:
|
||||||
if (
|
if input.path.startswith(
|
||||||
input.path.startswith("rtsp")
|
"rtsp"
|
||||||
and not camera.restream.force_audio
|
) and not camera.restream.audio_encoding == [
|
||||||
):
|
RestreamAudioCodecEnum.copy
|
||||||
|
]:
|
||||||
self.relays[
|
self.relays[
|
||||||
cam_name
|
cam_name
|
||||||
] = f"{escape_special_characters(input.path)}#backchannel=0"
|
] = f"{escape_special_characters(input.path)}#backchannel=0"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user