Use hwaccel to encode when available

This commit is contained in:
Nick Mowen 2023-05-20 14:41:04 -06:00
parent 3c75272763
commit 6acfecf0dd
2 changed files with 19 additions and 27 deletions

View File

@ -1508,10 +1508,8 @@ def vod_event(id):
@bp.route("/export/<camera_name>/start/<start_time>/end/<end_time>", methods=["POST"]) @bp.route("/export/<camera_name>/start/<start_time>/end/<end_time>", methods=["POST"])
def export_recording(camera_name: str, start_time: int, end_time: int): def export_recording(camera_name: str, start_time: int, end_time: int):
playback_factor = request.get_json(silent=True).get("playback", "realtime") playback_factor = request.get_json(silent=True).get("playback", "realtime")
logger.error(
f"The playback is {playback_factor} and found { PlaybackFactorEnum[playback_factor] if playback_factor in PlaybackFactorEnum.__members__.values() else PlaybackFactorEnum.realtime}"
)
exporter = RecordingExporter( exporter = RecordingExporter(
current_app.frigate_config,
camera_name, camera_name,
int(start_time), int(start_time),
int(end_time), int(end_time),

View File

@ -8,7 +8,9 @@ import threading
from enum import Enum from enum import Enum
import subprocess as sp import subprocess as sp
from frigate.config import FrigateConfig
from frigate.const import EXPORT_DIR, MAX_PLAYLIST_SECONDS from frigate.const import EXPORT_DIR, MAX_PLAYLIST_SECONDS
from frigate.ffmpeg_presets import parse_preset_hardware_acceleration_encode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -23,12 +25,14 @@ class RecordingExporter(threading.Thread):
def __init__( def __init__(
self, self,
config: FrigateConfig,
camera: str, camera: str,
start_time: int, start_time: int,
end_time: int, end_time: int,
playback_factor: PlaybackFactorEnum, playback_factor: PlaybackFactorEnum,
) -> None: ) -> None:
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.config = config
self.camera = camera self.camera = camera
self.start_time = start_time self.start_time = start_time
self.end_time = end_time self.end_time = end_time
@ -47,15 +51,9 @@ class RecordingExporter(threading.Thread):
if (self.end_time - self.start_time) <= MAX_PLAYLIST_SECONDS: if (self.end_time - self.start_time) <= MAX_PLAYLIST_SECONDS:
playlist_lines = f"http://127.0.0.1:5000/vod/{self.camera}/start/{self.start_time}/end/{self.end_time}/index.m3u8" playlist_lines = f"http://127.0.0.1:5000/vod/{self.camera}/start/{self.start_time}/end/{self.end_time}/index.m3u8"
ffmpeg_cmd = [ ffmpeg_input = (
"ffmpeg", f"-y -protocol_whitelist pipe,file,http,tcp -i {playlist_lines}"
"-hide_banner", )
"-y",
"-protocol_whitelist",
"pipe,file,http,tcp",
"-i",
playlist_lines,
]
else: else:
playlist_lines = [] playlist_lines = []
playlist_start = self.start_time playlist_start = self.start_time
@ -66,24 +64,20 @@ class RecordingExporter(threading.Thread):
) )
playlist_start += MAX_PLAYLIST_SECONDS playlist_start += MAX_PLAYLIST_SECONDS
ffmpeg_cmd = [ ffmpeg_input = "-y -protocol_whitelist pipe,file,http,tcp -f concat -safe 0 -i /dev/stdin"
"ffmpeg",
"-hide_banner",
"-y",
"-protocol_whitelist",
"pipe,file,http,tcp",
"-f",
"concat",
"-safe",
"0",
"-i",
"/dev/stdin",
]
if self.playback_factor == PlaybackFactorEnum.realtime: if self.playback_factor == PlaybackFactorEnum.realtime:
ffmpeg_cmd.extend(["-c", "copy", file_name]) ffmpeg_cmd = (
f"ffmpeg -hide_banner {ffmpeg_input} -c copy {file_name}"
).split(" ")
elif self.playback_factor == PlaybackFactorEnum.timelapse_25x: elif self.playback_factor == PlaybackFactorEnum.timelapse_25x:
ffmpeg_cmd.extend(["-vf", "setpts=0.04*PTS", "-r", "30", "-an", file_name]) ffmpeg_cmd = (
parse_preset_hardware_acceleration_encode(
self.config.ffmpeg.hwaccel_args,
ffmpeg_input,
f"-vf setpts=0.04*PTS -r 30 -an {file_name}",
)
).split(" ")
p = sp.run( p = sp.run(
ffmpeg_cmd, ffmpeg_cmd,