Add audio encoding field and simplify stream creation

This commit is contained in:
Nick Mowen 2023-01-14 15:04:43 -07:00
parent 878b2364a3
commit 1b5b4219c7
2 changed files with 35 additions and 16 deletions

View File

@ -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."

View File

@ -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"