hevc+重下模板

This commit is contained in:
2025-08-05 12:22:47 +08:00
parent bf912037d1
commit 2f694da5fd
7 changed files with 36 additions and 8 deletions

View File

@@ -7,5 +7,7 @@ TEMP_DIR=tmp/
ENCODER_ARGS="-c:v h264_qsv -global_quality 28 -look_ahead 1" ENCODER_ARGS="-c:v h264_qsv -global_quality 28 -look_ahead 1"
# NVENC # NVENC
#ENCODER_ARGS="-c:v h264_nvenc -cq:v 24 -preset:v p7 -tune:v hq -profile:v high" #ENCODER_ARGS="-c:v h264_nvenc -cq:v 24 -preset:v p7 -tune:v hq -profile:v high"
# HEVC
#VIDEO_ARGS="-profile:v main
UPLOAD_METHOD="rclone" UPLOAD_METHOD="rclone"
RCLONE_REPLACE_MAP="https://oss.zhentuai.com|alioss://frametour-assets,https://frametour-assets.oss-cn-shanghai.aliyuncs.com|alioss://frametour-assets" RCLONE_REPLACE_MAP="https://oss.zhentuai.com|alioss://frametour-assets,https://frametour-assets.oss-cn-shanghai.aliyuncs.com|alioss://frametour-assets"

View File

@@ -1,8 +1,8 @@
SUPPORT_FEATURE = ( SUPPORT_FEATURE = (
'simple_render_algo', 'simple_render_algo',
'gpu_accelerate', 'gpu_accelerate',
'gpu_accelerate', 'hevc_encode',
'rapid_download', 'rapid_download',
'rclone_upload', 'rclone_upload',
) )
SOFTWARE_VERSION = '0.0.2' SOFTWARE_VERSION = '0.0.3'

View File

@@ -6,11 +6,22 @@ from typing import Any
DEFAULT_ARGS = ("-shortest",) DEFAULT_ARGS = ("-shortest",)
ENCODER_ARGS = ("-c:v", "h264", ) if not os.getenv("ENCODER_ARGS", False) else os.getenv("ENCODER_ARGS", "").split(" ") ENCODER_ARGS = ("-c:v", "h264", ) if not os.getenv("ENCODER_ARGS", False) else os.getenv("ENCODER_ARGS", "").split(" ")
VIDEO_ARGS = ("-profile:v", "high", "-level:v", "4", ) VIDEO_ARGS = ("-profile:v", "high", "-level:v", "4", ) if not os.getenv("VIDEO_ARGS", False) else os.getenv("VIDEO_ARGS", "").split(" ")
AUDIO_ARGS = ("-c:a", "aac", "-b:a", "128k", "-ar", "48000", "-ac", "2", ) AUDIO_ARGS = ("-c:a", "aac", "-b:a", "128k", "-ar", "48000", "-ac", "2", )
MUTE_AUDIO_INPUT = ("-f", "lavfi", "-i", "anullsrc=cl=stereo:r=48000", ) MUTE_AUDIO_INPUT = ("-f", "lavfi", "-i", "anullsrc=cl=stereo:r=48000", )
def get_mp4toannexb_filter():
"""
Determine which mp4toannexb filter to use based on ENCODER_ARGS.
Returns 'hevc_mp4toannexb' if ENCODER_ARGS contains 'hevc', otherwise 'h264_mp4toannexb'.
"""
encoder_args_str = os.getenv("ENCODER_ARGS", "").lower()
if "hevc" in encoder_args_str:
return "hevc_mp4toannexb"
return "h264_mp4toannexb"
class FfmpegTask(object): class FfmpegTask(object):
effects: list[str] effects: list[str]
@@ -164,7 +175,7 @@ class FfmpegTask(object):
output_args = [*VIDEO_ARGS, *AUDIO_ARGS, *ENCODER_ARGS, *DEFAULT_ARGS] output_args = [*VIDEO_ARGS, *AUDIO_ARGS, *ENCODER_ARGS, *DEFAULT_ARGS]
if self.annexb: if self.annexb:
output_args.append("-bsf:v") output_args.append("-bsf:v")
output_args.append("h264_mp4toannexb") output_args.append(get_mp4toannexb_filter())
output_args.append("-reset_timestamps") output_args.append("-reset_timestamps")
output_args.append("1") output_args.append("1")
video_output_str = "[0:v]" video_output_str = "[0:v]"
@@ -359,7 +370,7 @@ class FfmpegTask(object):
output_args += AUDIO_ARGS output_args += AUDIO_ARGS
if self.annexb: if self.annexb:
output_args.append("-bsf:v") output_args.append("-bsf:v")
output_args.append("h264_mp4toannexb") output_args.append(get_mp4toannexb_filter())
output_args.append("-bsf:a") output_args.append("-bsf:a")
output_args.append("setts=pts=DTS") output_args.append("setts=pts=DTS")
output_args.append("-f") output_args.append("-f")

View File

@@ -1,15 +1,25 @@
from time import sleep from time import sleep
import sys
import config import config
import biz.task import biz.task
from telemetry import init_opentelemetry from telemetry import init_opentelemetry
from template import load_local_template from template import load_local_template, download_template, TEMPLATES
from util import api from util import api
import os import os
import glob import glob
load_local_template() load_local_template()
# Check for redownload parameter
if 'redownload' in sys.argv:
print("Redownloading all templates...")
for template_name in TEMPLATES.keys():
print(f"Redownloading template: {template_name}")
download_template(template_name)
print("All templates redownloaded successfully!")
sys.exit(0)
import logging import logging
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)

View File

@@ -79,6 +79,8 @@ def download_template(template_id):
tracer = get_tracer(__name__) tracer = get_tracer(__name__)
with tracer.start_as_current_span("download_template"): with tracer.start_as_current_span("download_template"):
template_info = api.get_template_info(template_id) template_info = api.get_template_info(template_id)
if template_info is None:
return
if not os.path.isdir(template_info['local_path']): if not os.path.isdir(template_info['local_path']):
os.makedirs(template_info['local_path']) os.makedirs(template_info['local_path'])
# download template assets # download template assets

View File

@@ -87,6 +87,9 @@ def get_template_info(template_id):
data = response.json() data = response.json()
logger.debug("获取模板信息结果:【%s", data) logger.debug("获取模板信息结果:【%s", data)
remote_template_info = data.get('data', {}) remote_template_info = data.get('data', {})
if not remote_template_info:
logger.warning("获取模板信息结果为空", data)
return None
template = { template = {
'id': template_id, 'id': template_id,
'updateTime': remote_template_info.get('updateTime', template_id), 'updateTime': remote_template_info.get('updateTime', template_id),

View File

@@ -7,7 +7,7 @@ from typing import Optional, IO
from opentelemetry.trace import Status, StatusCode from opentelemetry.trace import Status, StatusCode
from entity.ffmpeg import FfmpegTask, ENCODER_ARGS, VIDEO_ARGS, AUDIO_ARGS, MUTE_AUDIO_INPUT from entity.ffmpeg import FfmpegTask, ENCODER_ARGS, VIDEO_ARGS, AUDIO_ARGS, MUTE_AUDIO_INPUT, get_mp4toannexb_filter
from telemetry import get_tracer from telemetry import get_tracer
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -23,7 +23,7 @@ def re_encode_and_annexb(file):
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-vsync", "cfr", "-i", file, ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-vsync", "cfr", "-i", file,
*(set() if has_audio else MUTE_AUDIO_INPUT), *(set() if has_audio else MUTE_AUDIO_INPUT),
"-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", "h264_mp4toannexb", *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"])