You've already forked FrameTour-RenderWorker
Compare commits
3 Commits
0770cb361d
...
8f0250df43
Author | SHA1 | Date | |
---|---|---|---|
8f0250df43 | |||
0209c5de3f | |||
51e7d21f84 |
@@ -4,5 +4,6 @@ SUPPORT_FEATURE = (
|
|||||||
'hevc_encode',
|
'hevc_encode',
|
||||||
'rapid_download',
|
'rapid_download',
|
||||||
'rclone_upload',
|
'rclone_upload',
|
||||||
|
'custom_re_encode',
|
||||||
)
|
)
|
||||||
SOFTWARE_VERSION = '0.0.3'
|
SOFTWARE_VERSION = '0.0.4'
|
||||||
|
@@ -249,9 +249,10 @@ class FfmpegTask(object):
|
|||||||
filter_args.append(f"{_start_out_str}select=lt(n\\,{int(start * self.frame_rate)}){_start_out_str}")
|
filter_args.append(f"{_start_out_str}select=lt(n\\,{int(start * self.frame_rate)}){_start_out_str}")
|
||||||
filter_args.append(f"{_end_out_str}select=gt(n\\,{int(start * self.frame_rate)}){_end_out_str}")
|
filter_args.append(f"{_end_out_str}select=gt(n\\,{int(start * self.frame_rate)}){_end_out_str}")
|
||||||
filter_args.append(f"{_mid_out_str}select=eq(n\\,{int(start * self.frame_rate)}){_mid_out_str}")
|
filter_args.append(f"{_mid_out_str}select=eq(n\\,{int(start * self.frame_rate)}){_mid_out_str}")
|
||||||
filter_args.append(f"{_mid_out_str}tpad=start_mode=clone:start_duration={duration:.4f}{_mid_out_str}")
|
filter_args.append(
|
||||||
|
f"{_mid_out_str}tpad=start_mode=clone:start_duration={duration:.4f}{_mid_out_str}")
|
||||||
if rotate_deg != 0:
|
if rotate_deg != 0:
|
||||||
filter_args.append(f"{_mid_out_str}rotate=PI*{rotate_deg}/360{_mid_out_str}")
|
filter_args.append(f"{_mid_out_str}rotate=PI*{rotate_deg}/180{_mid_out_str}")
|
||||||
# filter_args.append(f"{video_output_str}trim=start=0:end={start+duration},tpad=stop_mode=clone:stop_duration={duration},setpts=PTS-STARTPTS{_start_out_str}")
|
# filter_args.append(f"{video_output_str}trim=start=0:end={start+duration},tpad=stop_mode=clone:stop_duration={duration},setpts=PTS-STARTPTS{_start_out_str}")
|
||||||
# filter_args.append(f"tpad=start_mode=clone:start_duration={duration},setpts=PTS-STARTPTS{_start_out_str}")
|
# filter_args.append(f"tpad=start_mode=clone:start_duration={duration},setpts=PTS-STARTPTS{_start_out_str}")
|
||||||
# filter_args.append(f"{_end_out_str}trim=start={start}{_end_out_str}")
|
# filter_args.append(f"{_end_out_str}trim=start={start}{_end_out_str}")
|
||||||
@@ -269,7 +270,44 @@ class FfmpegTask(object):
|
|||||||
filter_args.append(f"{video_output_str}setpts={param}*PTS[v_eff{effect_index}]")
|
filter_args.append(f"{video_output_str}setpts={param}*PTS[v_eff{effect_index}]")
|
||||||
video_output_str = f"[v_eff{effect_index}]"
|
video_output_str = f"[v_eff{effect_index}]"
|
||||||
elif effect.startswith("zoom:"):
|
elif effect.startswith("zoom:"):
|
||||||
...
|
param = effect.split(":", 2)[1]
|
||||||
|
if param == '':
|
||||||
|
continue
|
||||||
|
_split = param.split(",")
|
||||||
|
if len(_split) < 3:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
start_time = float(_split[0])
|
||||||
|
zoom_factor = float(_split[1])
|
||||||
|
duration = float(_split[2])
|
||||||
|
if start_time < 0:
|
||||||
|
start_time = 0
|
||||||
|
if duration < 0:
|
||||||
|
duration = 0
|
||||||
|
if zoom_factor <= 0:
|
||||||
|
zoom_factor = 1
|
||||||
|
except (ValueError, IndexError):
|
||||||
|
start_time = 0
|
||||||
|
duration = 0
|
||||||
|
zoom_factor = 1
|
||||||
|
if zoom_factor == 1:
|
||||||
|
continue
|
||||||
|
effect_index += 1
|
||||||
|
if duration == 0:
|
||||||
|
filter_args.append(f"{video_output_str}trim=start={start_time},scale=iw*{zoom_factor}:ih*{zoom_factor},crop=iw/{zoom_factor}:ih/{zoom_factor}:(iw-iw/{zoom_factor})/2:(ih-ih/{zoom_factor})/2,setpts=PTS-STARTPTS[v_eff{effect_index}]")
|
||||||
|
else:
|
||||||
|
zoom_expr = f"if(between(t,{start_time},{start_time + duration}),{zoom_factor},1)"
|
||||||
|
filter_args.append(f"{video_output_str}scale=iw*({zoom_expr}):ih*({zoom_expr}),crop=iw:ih:(iw-iw)/2:(ih-ih)/2[v_eff{effect_index}]")
|
||||||
|
video_output_str = f"[v_eff{effect_index}]"
|
||||||
|
elif effect.startswith("skip:"):
|
||||||
|
param = effect.split(":", 2)[1]
|
||||||
|
if param == '':
|
||||||
|
param = "0"
|
||||||
|
skip_seconds = float(param)
|
||||||
|
if skip_seconds > 0:
|
||||||
|
effect_index += 1
|
||||||
|
filter_args.append(f"{video_output_str}trim=start={skip_seconds},setpts=PTS-STARTPTS[v_eff{effect_index}]")
|
||||||
|
video_output_str = f"[v_eff{effect_index}]"
|
||||||
...
|
...
|
||||||
if self.resolution:
|
if self.resolution:
|
||||||
filter_args.append(f"{video_output_str}scale={self.resolution.replace('x', ':')}[v]")
|
filter_args.append(f"{video_output_str}scale={self.resolution.replace('x', ':')}[v]")
|
||||||
|
@@ -20,13 +20,23 @@ def re_encode_and_annexb(file):
|
|||||||
return file
|
return file
|
||||||
logger.info("ReEncodeAndAnnexb: %s", file)
|
logger.info("ReEncodeAndAnnexb: %s", file)
|
||||||
has_audio = not not probe_video_audio(file)
|
has_audio = not not probe_video_audio(file)
|
||||||
|
# 优先使用RE_ENCODE_VIDEO_ARGS环境变量,其次使用默认的VIDEO_ARGS
|
||||||
|
if os.getenv("RE_ENCODE_VIDEO_ARGS", False):
|
||||||
|
_video_args = tuple(os.getenv("RE_ENCODE_VIDEO_ARGS", "").split(" "))
|
||||||
|
else:
|
||||||
|
_video_args = VIDEO_ARGS
|
||||||
|
# 优先使用RE_ENCODE_ENCODER_ARGS环境变量,其次使用默认的ENCODER_ARGS
|
||||||
|
if os.getenv("RE_ENCODE_ENCODER_ARGS", False):
|
||||||
|
_encoder_args = tuple(os.getenv("RE_ENCODE_ENCODER_ARGS", "").split(" "))
|
||||||
|
else:
|
||||||
|
_encoder_args = ENCODER_ARGS
|
||||||
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-i", file,
|
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-i", file,
|
||||||
*(set() if has_audio else MUTE_AUDIO_INPUT),
|
*(set() if has_audio else MUTE_AUDIO_INPUT),
|
||||||
"-fps_mode", "cfr",
|
"-fps_mode", "cfr",
|
||||||
"-map", "0:v", "-map", "0:a" if has_audio else "1:a",
|
"-map", "0:v", "-map", "0:a" if has_audio else "1:a",
|
||||||
*VIDEO_ARGS, "-bsf:v", get_mp4toannexb_filter(),
|
*_video_args, "-bsf:v", get_mp4toannexb_filter(),
|
||||||
*AUDIO_ARGS, "-bsf:a", "setts=pts=DTS",
|
*AUDIO_ARGS, "-bsf:a", "setts=pts=DTS",
|
||||||
*ENCODER_ARGS, "-shortest", "-fflags", "+genpts",
|
*_encoder_args, "-shortest", "-fflags", "+genpts",
|
||||||
"-f", "mpegts", file + ".ts"])
|
"-f", "mpegts", file + ".ts"])
|
||||||
logger.info(" ".join(ffmpeg_process.args))
|
logger.info(" ".join(ffmpeg_process.args))
|
||||||
span.set_attribute("ffmpeg.args", json.dumps(ffmpeg_process.args))
|
span.set_attribute("ffmpeg.args", json.dumps(ffmpeg_process.args))
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from opentelemetry.trace import Status, StatusCode
|
from opentelemetry.trace import Status, StatusCode
|
||||||
@@ -70,7 +71,7 @@ def upload_to_oss(url, file_path):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def download_from_oss(url, file_path, skip_if_exist=False):
|
def download_from_oss(url, file_path, skip_if_exist=None):
|
||||||
"""
|
"""
|
||||||
使用签名URL下载文件到OSS
|
使用签名URL下载文件到OSS
|
||||||
:param skip_if_exist: 如果存在就不下载了
|
:param skip_if_exist: 如果存在就不下载了
|
||||||
@@ -82,6 +83,11 @@ def download_from_oss(url, file_path, skip_if_exist=False):
|
|||||||
with tracer.start_as_current_span("download_from_oss") as span:
|
with tracer.start_as_current_span("download_from_oss") as span:
|
||||||
span.set_attribute("file.url", url)
|
span.set_attribute("file.url", url)
|
||||||
span.set_attribute("file.path", file_path)
|
span.set_attribute("file.path", file_path)
|
||||||
|
|
||||||
|
# 如果skip_if_exist为None,则从启动参数中读取
|
||||||
|
if skip_if_exist is None:
|
||||||
|
skip_if_exist = 'skip_if_exist' in sys.argv
|
||||||
|
|
||||||
if skip_if_exist and os.path.exists(file_path):
|
if skip_if_exist and os.path.exists(file_path):
|
||||||
span.set_attribute("file.exist", True)
|
span.set_attribute("file.exist", True)
|
||||||
span.set_attribute("file.size", os.path.getsize(file_path))
|
span.set_attribute("file.size", os.path.getsize(file_path))
|
||||||
|
Reference in New Issue
Block a user