Merge branch 'master' into windows_nvidia
This commit is contained in:
commit
5fc948b9c5
@ -141,7 +141,7 @@ class FfmpegTask(object):
|
|||||||
return False
|
return False
|
||||||
if self.speed != 1:
|
if self.speed != 1:
|
||||||
return False
|
return False
|
||||||
if len(self.audios) > 1:
|
if len(self.audios) >= 1:
|
||||||
return False
|
return False
|
||||||
if len(self.input_file) > 1:
|
if len(self.input_file) > 1:
|
||||||
return False
|
return False
|
||||||
@ -220,6 +220,15 @@ class FfmpegTask(object):
|
|||||||
# filter_args.append(f"{_end_out_str}{_start_out_str}overlay=eof_action=pass{video_output_str}")
|
# filter_args.append(f"{_end_out_str}{_start_out_str}overlay=eof_action=pass{video_output_str}")
|
||||||
filter_args.append(f"{_start_out_str}{_mid_out_str}{_end_out_str}concat=n=3:v=1:a=0,setpts=N/{self.frame_rate}/TB{video_output_str}")
|
filter_args.append(f"{_start_out_str}{_mid_out_str}{_end_out_str}concat=n=3:v=1:a=0,setpts=N/{self.frame_rate}/TB{video_output_str}")
|
||||||
effect_index += 1
|
effect_index += 1
|
||||||
|
elif effect.startswith("ospeed:"):
|
||||||
|
param = effect.split(":", 2)[1]
|
||||||
|
if param == '':
|
||||||
|
param = "1"
|
||||||
|
if param != "1":
|
||||||
|
# 视频变速
|
||||||
|
effect_index += 1
|
||||||
|
filter_args.append(f"{video_output_str}setpts={param}*PTS[v_eff{effect_index}]")
|
||||||
|
video_output_str = f"[v_eff{effect_index}]"
|
||||||
elif effect.startswith("zoom:"):
|
elif effect.startswith("zoom:"):
|
||||||
...
|
...
|
||||||
...
|
...
|
||||||
@ -268,16 +277,26 @@ class FfmpegTask(object):
|
|||||||
audio_output_str = ""
|
audio_output_str = ""
|
||||||
audio_track_index = 0
|
audio_track_index = 0
|
||||||
# output_args
|
# output_args
|
||||||
_tmp_file = "tmp_concat_"+str(time.time())+".txt"
|
if len(self.input_file) == 1:
|
||||||
with open(_tmp_file, "w", encoding="utf-8") as f:
|
_file = self.input_file[0]
|
||||||
for input_file in self.input_file:
|
from util.ffmpeg import probe_video_audio
|
||||||
if type(input_file) is str:
|
if type(_file) is str:
|
||||||
f.write("file '"+input_file+"'\n")
|
input_args += ["-i", _file]
|
||||||
elif isinstance(input_file, FfmpegTask):
|
self.mute = not probe_video_audio(_file)
|
||||||
f.write("file '" + input_file.get_output_file() + "'\n")
|
elif isinstance(_file, FfmpegTask):
|
||||||
input_args += ["-f", "concat", "-safe", "0", "-i", _tmp_file]
|
input_args += ["-i", _file.get_output_file()]
|
||||||
from util.ffmpeg import probe_video_audio
|
self.mute = not probe_video_audio(_file.get_output_file())
|
||||||
self.mute = not probe_video_audio(_tmp_file, "concat")
|
else:
|
||||||
|
_tmp_file = "tmp_concat_" + str(time.time()) + ".txt"
|
||||||
|
from util.ffmpeg import probe_video_audio
|
||||||
|
with open(_tmp_file, "w", encoding="utf-8") as f:
|
||||||
|
for input_file in self.input_file:
|
||||||
|
if type(input_file) is str:
|
||||||
|
f.write("file '" + input_file + "'\n")
|
||||||
|
elif isinstance(input_file, FfmpegTask):
|
||||||
|
f.write("file '" + input_file.get_output_file() + "'\n")
|
||||||
|
input_args += ["-f", "concat", "-safe", "0", "-i", _tmp_file]
|
||||||
|
self.mute = not probe_video_audio(_tmp_file, "concat")
|
||||||
output_args.append("-map")
|
output_args.append("-map")
|
||||||
output_args.append("0:v")
|
output_args.append("0:v")
|
||||||
output_args.append("-c:v")
|
output_args.append("-c:v")
|
||||||
@ -304,8 +323,13 @@ class FfmpegTask(object):
|
|||||||
else:
|
else:
|
||||||
output_args.append(audio_output_str)
|
output_args.append(audio_output_str)
|
||||||
output_args += AUDIO_ARGS
|
output_args += AUDIO_ARGS
|
||||||
|
if self.annexb:
|
||||||
|
output_args.append("-bsf:v")
|
||||||
|
output_args.append("h264_mp4toannexb")
|
||||||
|
output_args.append("-bsf:a")
|
||||||
|
output_args.append("setts=pts=DTS")
|
||||||
output_args.append("-f")
|
output_args.append("-f")
|
||||||
output_args.append("mp4")
|
output_args.append("mpegts" if self.annexb else "mp4")
|
||||||
_filter_args = [] if len(filter_args) == 0 else ["-filter_complex", ";".join(filter_args)]
|
_filter_args = [] if len(filter_args) == 0 else ["-filter_complex", ";".join(filter_args)]
|
||||||
return args + input_args + _filter_args + output_args + [self.get_output_file()]
|
return args + input_args + _filter_args + output_args + [self.get_output_file()]
|
||||||
elif self.task_type == 'copy':
|
elif self.task_type == 'copy':
|
||||||
|
@ -12,31 +12,6 @@ from telemetry import get_tracer
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def to_annexb(file):
|
|
||||||
with get_tracer("ffmpeg").start_as_current_span("to_annexb") as span:
|
|
||||||
span.set_attribute("file.path", file)
|
|
||||||
if not os.path.exists(file):
|
|
||||||
span.set_status(Status(StatusCode.ERROR))
|
|
||||||
return file
|
|
||||||
logger.info("ToAnnexb: %s", file)
|
|
||||||
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-i", file,
|
|
||||||
*MUTE_AUDIO_INPUT,
|
|
||||||
"-map", "0:v", "-map", "1:a",
|
|
||||||
"-c:v", "copy", "-bsf:v", "h264_mp4toannexb", "-shortest",
|
|
||||||
"-c:a", "aac", "-b:a", "128k", "-ar", "48000", "-ac", "2",
|
|
||||||
"-f", "mpegts", file+".ts"])
|
|
||||||
span.set_attribute("ffmpeg.args", json.dumps(ffmpeg_process.args))
|
|
||||||
logger.info("ToAnnexb: %s, returned: %s", file, ffmpeg_process.returncode)
|
|
||||||
span.set_attribute("ffmpeg.code", ffmpeg_process.returncode)
|
|
||||||
if ffmpeg_process.returncode == 0:
|
|
||||||
span.set_status(Status(StatusCode.OK))
|
|
||||||
span.set_attribute("file.size", os.path.getsize(file+".ts"))
|
|
||||||
os.remove(file)
|
|
||||||
return file+".ts"
|
|
||||||
else:
|
|
||||||
span.set_status(Status(StatusCode.ERROR))
|
|
||||||
return file
|
|
||||||
|
|
||||||
def re_encode_and_annexb(file):
|
def re_encode_and_annexb(file):
|
||||||
with get_tracer("ffmpeg").start_as_current_span("re_encode_and_annexb") as span:
|
with get_tracer("ffmpeg").start_as_current_span("re_encode_and_annexb") as span:
|
||||||
span.set_attribute("file.path", file)
|
span.set_attribute("file.path", file)
|
||||||
@ -44,20 +19,22 @@ def re_encode_and_annexb(file):
|
|||||||
span.set_status(Status(StatusCode.ERROR))
|
span.set_status(Status(StatusCode.ERROR))
|
||||||
return file
|
return file
|
||||||
logger.info("ReEncodeAndAnnexb: %s", file)
|
logger.info("ReEncodeAndAnnexb: %s", file)
|
||||||
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-i", file,
|
has_audio = not not probe_video_audio(file)
|
||||||
*MUTE_AUDIO_INPUT,
|
ffmpeg_process = subprocess.run(["ffmpeg", "-y", "-hide_banner", "-vsync", "cfr", "-i", file,
|
||||||
"-map", "0:v", "-map", "1:a",
|
*(set() if has_audio else MUTE_AUDIO_INPUT),
|
||||||
|
"-map", "0:v", "-map", "0:a" if has_audio else "1:a",
|
||||||
*VIDEO_ARGS, "-bsf:v", "h264_mp4toannexb",
|
*VIDEO_ARGS, "-bsf:v", "h264_mp4toannexb",
|
||||||
*AUDIO_ARGS, "-bsf:a", "setts=pts=DTS",
|
*AUDIO_ARGS, "-bsf:a", "setts=pts=DTS",
|
||||||
*ENCODER_ARGS, "-shortest",
|
*ENCODER_ARGS, "-shortest", "-fflags", "+genpts",
|
||||||
"-f", "mpegts", file + ".ts"])
|
"-f", "mpegts", file + ".ts"])
|
||||||
|
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))
|
||||||
logger.info("ReEncodeAndAnnexb: %s, returned: %s", file, ffmpeg_process.returncode)
|
logger.info("ReEncodeAndAnnexb: %s, returned: %s", file, ffmpeg_process.returncode)
|
||||||
span.set_attribute("ffmpeg.code", ffmpeg_process.returncode)
|
span.set_attribute("ffmpeg.code", ffmpeg_process.returncode)
|
||||||
if ffmpeg_process.returncode == 0:
|
if ffmpeg_process.returncode == 0:
|
||||||
span.set_status(Status(StatusCode.OK))
|
span.set_status(Status(StatusCode.OK))
|
||||||
span.set_attribute("file.size", os.path.getsize(file+".ts"))
|
span.set_attribute("file.size", os.path.getsize(file+".ts"))
|
||||||
os.remove(file)
|
# os.remove(file)
|
||||||
return file+".ts"
|
return file+".ts"
|
||||||
else:
|
else:
|
||||||
span.set_status(Status(StatusCode.ERROR))
|
span.set_status(Status(StatusCode.ERROR))
|
||||||
@ -67,7 +44,6 @@ def start_render(ffmpeg_task: FfmpegTask):
|
|||||||
tracer = get_tracer(__name__)
|
tracer = get_tracer(__name__)
|
||||||
with tracer.start_as_current_span("start_render") as span:
|
with tracer.start_as_current_span("start_render") as span:
|
||||||
span.set_attribute("ffmpeg.task", str(ffmpeg_task))
|
span.set_attribute("ffmpeg.task", str(ffmpeg_task))
|
||||||
logger.info(ffmpeg_task)
|
|
||||||
if not ffmpeg_task.need_run():
|
if not ffmpeg_task.need_run():
|
||||||
ffmpeg_task.set_output_file(ffmpeg_task.input_file[0])
|
ffmpeg_task.set_output_file(ffmpeg_task.input_file[0])
|
||||||
span.set_status(Status(StatusCode.OK))
|
span.set_status(Status(StatusCode.OK))
|
||||||
@ -79,7 +55,7 @@ def start_render(ffmpeg_task: FfmpegTask):
|
|||||||
return True
|
return True
|
||||||
ffmpeg_process = subprocess.run(["ffmpeg", "-progress", "-", "-loglevel", "error", *ffmpeg_args], **subprocess_args(True))
|
ffmpeg_process = subprocess.run(["ffmpeg", "-progress", "-", "-loglevel", "error", *ffmpeg_args], **subprocess_args(True))
|
||||||
span.set_attribute("ffmpeg.args", json.dumps(ffmpeg_process.args))
|
span.set_attribute("ffmpeg.args", json.dumps(ffmpeg_process.args))
|
||||||
logger.info(ffmpeg_process.args)
|
logger.info(" ".join(ffmpeg_process.args))
|
||||||
ffmpeg_final_out = handle_ffmpeg_output(ffmpeg_process.stdout)
|
ffmpeg_final_out = handle_ffmpeg_output(ffmpeg_process.stdout)
|
||||||
span.set_attribute("ffmpeg.out", ffmpeg_final_out)
|
span.set_attribute("ffmpeg.out", ffmpeg_final_out)
|
||||||
logger.info("FINISH TASK, OUTPUT IS %s", ffmpeg_final_out)
|
logger.info("FINISH TASK, OUTPUT IS %s", ffmpeg_final_out)
|
||||||
@ -167,6 +143,7 @@ def probe_video_audio(video_file, type=None):
|
|||||||
args.append("-f")
|
args.append("-f")
|
||||||
args.append("concat")
|
args.append("concat")
|
||||||
args.append(video_file)
|
args.append(video_file)
|
||||||
|
logger.info(" ".join(args))
|
||||||
result = subprocess.run(args, stderr=subprocess.STDOUT, **subprocess_args(True))
|
result = subprocess.run(args, stderr=subprocess.STDOUT, **subprocess_args(True))
|
||||||
span.set_attribute("ffprobe.args", json.dumps(result.args))
|
span.set_attribute("ffprobe.args", json.dumps(result.args))
|
||||||
span.set_attribute("ffprobe.code", result.returncode)
|
span.set_attribute("ffprobe.code", result.returncode)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user