mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	* Add video codec to restream config * Add handling of encode engine and video codec * Add test for video encoding * Set in main configuration docs as well * Add example to restream docs * Put back patch
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Controls go2rtc restream."""
 | |
| 
 | |
| 
 | |
| import logging
 | |
| import requests
 | |
| 
 | |
| from typing import Optional
 | |
| 
 | |
| from frigate.config import FrigateConfig, RestreamCodecEnum
 | |
| from frigate.const import BIRDSEYE_PIPE
 | |
| from frigate.ffmpeg_presets import (
 | |
|     parse_preset_hardware_acceleration_encode,
 | |
|     parse_preset_hardware_acceleration_go2rtc_engine,
 | |
| )
 | |
| from frigate.util import escape_special_characters
 | |
| 
 | |
| logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| def get_manual_go2rtc_stream(
 | |
|     camera_url: str, codec: RestreamCodecEnum, engine: Optional[str]
 | |
| ) -> str:
 | |
|     """Get a manual stream for go2rtc."""
 | |
|     if codec == RestreamCodecEnum.copy:
 | |
|         return f"ffmpeg:{camera_url}#video=copy#audio=aac#audio=opus"
 | |
| 
 | |
|     if engine:
 | |
|         return (
 | |
|             f"ffmpeg:{camera_url}#video={codec}#hardware={engine}#audio=aac#audio=opus"
 | |
|         )
 | |
| 
 | |
|     return f"ffmpeg:{camera_url}#video={codec}#audio=aac#audio=opus"
 | |
| 
 | |
| 
 | |
| class RestreamApi:
 | |
|     """Control go2rtc relay API."""
 | |
| 
 | |
|     def __init__(self, config: FrigateConfig) -> None:
 | |
|         self.config: FrigateConfig = config
 | |
| 
 | |
|     def add_cameras(self) -> None:
 | |
|         """Add cameras to go2rtc."""
 | |
|         self.relays: dict[str, str] = {}
 | |
| 
 | |
|         for cam_name, camera in self.config.cameras.items():
 | |
|             if not camera.restream.enabled:
 | |
|                 continue
 | |
| 
 | |
|             for input in camera.ffmpeg.inputs:
 | |
|                 if "restream" in input.roles:
 | |
|                     if (
 | |
|                         input.path.startswith("rtsp")
 | |
|                         and not camera.restream.force_audio
 | |
|                     ):
 | |
|                         self.relays[cam_name] = escape_special_characters(input.path)
 | |
|                     else:
 | |
|                         # go2rtc only supports rtsp for direct relay, otherwise ffmpeg is used
 | |
|                         self.relays[cam_name] = get_manual_go2rtc_stream(
 | |
|                             escape_special_characters(input.path),
 | |
|                             camera.restream.video_encoding,
 | |
|                             parse_preset_hardware_acceleration_go2rtc_engine(
 | |
|                                 self.config.ffmpeg.hwaccel_args
 | |
|                             ),
 | |
|                         )
 | |
| 
 | |
|         if self.config.restream.birdseye:
 | |
|             self.relays[
 | |
|                 "birdseye"
 | |
|             ] = f"exec:ffmpeg -hide_banner -f rawvideo -pix_fmt yuv420p -video_size {self.config.birdseye.width}x{self.config.birdseye.height} -r 10 -i {BIRDSEYE_PIPE} {' '.join(parse_preset_hardware_acceleration_encode(self.config.ffmpeg.hwaccel_args))} -rtsp_transport tcp -f rtsp {{output}}"
 | |
| 
 | |
|         for name, path in self.relays.items():
 | |
|             params = {"src": path, "name": name}
 | |
|             requests.put("http://127.0.0.1:1984/api/streams", params=params)
 |