def do_encode(clip: vs.VideoNode)-> None: """Compression with x26X""" if not os.path.exists(JPBD.output): print('\n\n\nVideo encoding') vdf.encode(clip, 'x264', JPBD.output, **X264_ARGS, frames=clip.num_frames) if not os.path.exists(JPBD.a_src): print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') if not os.path.exists(JPBD.a_src_cut.format(1)): print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) if not os.path.exists(JPBD.a_enc_cut.format(1)): print('\n\n\nAudio encoding') qaac_args = ['ffmpeg', '-i', JPBD.a_src_cut.format(1), '-compression_level', '12', '-lpc_type', 'cholesky', '-lpc_passes', '3', '-exact_rice_parameters', '1', JPBD.a_enc_cut.format(1)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') if not os.path.exists(JPBD.output_final): print('\nFinal muxing') mkv_args = ['mkvmerge', '-o', JPBD.output_final, '--track-name', '0:AVC BDRip by Vardë@Raws-Maji', '--language', '0:jpn', JPBD.output, '--track-name', '0:FLAC 2.0', '--language', '0:jpn', JPBD.a_enc_cut.format(1)] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') # Clean up files = [JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1)] for file in files: if os.path.exists(file): os.remove(file)
def do_encode(clip: vs.VideoNode)-> None: """Compression with x265""" print('\n\n\nVideo encoding') if not os.path.exists(JPBD.output): x265_args = [ "x265", "--y4m", "--frames", f"{clip.num_frames}", "--sar", "1", "--output-depth", "10", "--colormatrix", "bt709", "--colorprim", "bt709", "--transfer", "bt709", "--range", "limited", "--min-luma", str(16<<2), "--max-luma", str(235<<2), "--fps", f"{clip.fps_num}/{clip.fps_den}", "-o", JPBD.output, "-", "--frame-threads", "4", "--no-sao", "--fades", "--preset", "slower", "--crf", "15", "--qcomp", "0.70", "--bframes", "16", "--psy-rd", "2.0", "--psy-rdoq", "1.0", "--deblock", "-1:-1", "--rc-lookahead", "96", "--min-keyint", "23", "--keyint", "360", "--aq-mode", "3", "--aq-strength", "1.0" ] print("Encoder command: ", " ".join(x265_args), "\n") process = subprocess.Popen(x265_args, stdin=subprocess.PIPE) clip.output(process.stdin, y4m=True, progress_update=lambda value, endvalue: print(f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) print('\n\n\nAudio encoding') qaac_args = ['qaac', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') ffprobe_args = ['ffprobe', '-loglevel', 'quiet', '-show_entries', 'format_tags=encoder', '-print_format', 'default=nokey=1:noprint_wrappers=1', JPBD.a_enc_cut.format(1)] encoder_name = subprocess.check_output(ffprobe_args, shell=True, encoding='utf-8') f = open("tags_aac.xml", 'w') f.writelines(['<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}</String>', '</Simple>', '</Tag>', '</Tags>']) f.close() print('\nFinal muxing') mkv_args = ['mkvmerge', '-o', JPBD.output_final, '--timestamps', '0:symphogearg_12_timecode.txt', '--track-name', '0:HEVC BDRip by Vardë@Kodoku-no-Kawarini', '--language', '0:jpn', JPBD.output, '--tags', '0:tags_aac.xml', '--track-name', '0:AAC 2.0', '--language', '0:jpn', JPBD.a_enc_cut.format(1), '--chapter-language', 'fra', '--chapters', JPBD.chapter] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') # Clean up files = [JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1), 'tags_aac.xml'] for file in files: if os.path.exists(file): os.remove(file)
def do_encode(clip: vs.VideoNode)-> None: """Compression with x26X""" print('\n\n\nVideo encoding') vdf.encode(clip, 'x264', JPBD.output, **X264_ARGS, frames=clip.num_frames) print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) print('\n\n\nAudio encoding') qaac_args = ['qaac', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') ffprobe_args = ['ffprobe', '-loglevel', 'quiet', '-show_entries', 'format_tags=encoder', '-print_format', 'default=nokey=1:noprint_wrappers=1', JPBD.a_enc_cut.format(1)] encoder_name = subprocess.check_output(ffprobe_args, shell=True, encoding='utf-8') f = open("tags_aac.xml", 'w') f.writelines(['<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}</String>', '</Simple>', '</Tag>', '</Tags>']) f.close() print('\nFinal muxing') mkv_args = ['mkvmerge', '-o', JPBD.output_final, '--track-name', '0:AVC BDRip par Vardë@Owlolf', '--language', '0:jpn', JPBD.output, '--tags', '0:tags_aac.xml', '--track-name', '0:AAC 2.0', '--language', '0:jpn', JPBD.a_enc_cut.format(1)] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') _ = [os.remove(f) for f in [JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1), 'tags_aac.xml']]
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vdf.gk(SRC_CUT, QPFILE) print('\n\n\nVideo encode') vdf.encode(filtered, X264, OUTPUT, **X264_ARGS) print('\n\n\nAudio extraction') mka = MKVFile() mka.add_track(MKVTrack(SRC, 1)) mka.mux(A_SRC) print('\n\n\nAudio cut') eztrim(SRC_CLIP, (FRAME_START, FRAME_END), A_SRC, mkvextract_path='mkvextract') print('\n\n\nAudio encode') qaac_args = [ 'qaac64', A_SRC_CUT, '-V', '127', '--no-delay', '-o', A_ENC_CUT ] vdf.subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') print('\nFinal mux') mkv = MKVFile() mkv.add_track(MKVTrack(OUTPUT, language='jpn', default_track=True)) mkv.add_track(MKVTrack(A_ENC_CUT, language='jpn', default_track=True)) mkv.chapters(CHAPTER, 'jpn') mkv.mux(OUTPUT_FINAL)
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vdf.gk(JPBD.src_cut, JPBD.qpfile) print('\n\n\nVideo encoding') vdf.encode(filtered, X264, JPBD.output, **X264_ARGS) print('\n\n\nAudio extraction') track_01 = USBD.a_src + '_eng.w64' track_02 = USBD.a_src + '_jpn.w64' eac3to_args = ['eac3to', USBD.src, '3:', track_01, '4:', track_02, '-log=NUL'] vdf.subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') mka = MKVFile() mka.add_track(MKVTrack(track_01, 0)) mka.add_track(MKVTrack(track_02, 0)) mka.mux(USBD.a_src) print('\n\n\nAudio cutting') eztrim(USBD.src_clip, (USBD.frame_start, USBD.frame_end), USBD.a_src, mkvextract_path='mkvextract') print('\n\n\nAudio encoding') for i in range(1, len(mka.tracks) + 1): qaac_args = ['qaac64', USBD.a_src_cut.format(i), '-V', '127', '--no-delay', '-o', USBD.a_enc_cut.format(i)] vdf.subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') print('\nFinal muxing') mkv = MKVFile() mkv.add_track(MKVTrack(JPBD.output, language='jpn', default_track=True)) mkv.add_track(MKVTrack(USBD.a_enc_cut.format(2), language='jpn', default_track=True)) mkv.add_track(MKVTrack(USBD.a_enc_cut.format(1), language='eng', default_track=False)) mkv.mux(JPBD.output_final)
def do_encode(clip: vs.VideoNode) -> vs.VideoNode: """Compression with x26X""" if not os.path.isfile(JPBD.output): print('\n\n\nVideo encoding') bits = clip.format.bits_per_sample x265_cmd = f'x265 -o {JPBD.output} - --y4m' + ' ' x265_cmd += f'--csv {JPBD.name}_log_x265.csv --csv-log-level 2' + ' ' x265_cmd += '--preset slower' + ' ' x265_cmd += f'--frames {clip.num_frames} --fps {clip.fps_num}/{clip.fps_den} --output-depth {bits}' + ' ' x265_cmd += '--rd 3 --no-rect --no-amp --rskip 1 --tu-intra-depth 2 --tu-inter-depth 2 --tskip' + ' ' x265_cmd += '--merange 48 --weightb' + ' ' x265_cmd += '--no-strong-intra-smoothing' + ' ' x265_cmd += '--psy-rd 2.0 --psy-rdoq 1.5 --no-open-gop --keyint 240 --min-keyint 23 --scenecut 40 --rc-lookahead 60 --bframes 16' + ' ' x265_cmd += '--crf 15 --aq-mode 3 --aq-strength 0.85 --cbqpoffs -2 --crqpoffs -2 --qcomp 0.70' + ' ' x265_cmd += '--deblock=-1:-1 --no-sao --no-sao-non-deblock' + ' ' x265_cmd += f'--sar 1 --range limited --colorprim 1 --transfer 1 --colormatrix 1 --min-luma {str(16 << (bits - 8))} --max-luma {str(235 << (bits - 8))}' print("Encoder command: ", " ".join(shlex.split(x265_cmd)), "\n") process = subprocess.Popen(shlex.split(x265_cmd), stdin=subprocess.PIPE) clip.output(process.stdin, y4m=True, progress_update=lambda value, endvalue: print(f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src.format(1), '3:', JPBD.a_src.format(2), '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src.format(1), JPBD.a_src_cut.format(1)) eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src.format(2), JPBD.a_src_cut.format(2))
def do_encode(filtered): """Compression with x264""" print('\n\n\nVideo encoding') vdf.encode(filtered, X264, OUTPUT, True, **X264_ARGS, frames=filtered.num_frames) print('\n\n\nAudio extracting') mka = MKVFile() mka.add_track(MKVTrack(VIDEO_FILES[1], 1)) mka.mux(AUDIO_SRC) print('\n\n\nAudio cutting') eztrim(CLIPS_SRC[1], (0, 1), AUDIO_SRC, outfile=NAME + '_a', ffmpeg_path='') eztrim(CLIPS_SRC[1], (0, 0), AUDIO_SRC, outfile=NAME + '_b', ffmpeg_path='') print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', NAME + '.mkv', '--language', '0:jpn', OUTPUT, '--language', '0:jpn', NAME + '_a' + '.mka', '+', NAME + '_b' + '.mka' ] vdf.subprocess.run(mkv_args, text=True, check=True, encoding='utf-8')
def do_encode(filtered): """Compression with x264""" print("Qpfile generating") vrf.gk(SRC_CUT, QPFILE) print("\n\n\nVideo encode") vrf.encode(filtered, X264, OUTPUT, **X264_ARGS) print("\n\n\nAudio extraction") eac3to_args = ['eac3to', SRC, '2:', A_SRC, '-log=NUL'] vrf.subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print("\n\n\nAudio cut") eztrim(SRC_CLIP, (FRAME_START, FRAME_END), A_SRC, mkvextract_path="mkvextract") print("\n\n\nAudio encode") qaac_args = ['qaac64', A_SRC_CUT, '-V', '127', '--no-delay', '-o', A_ENC_CUT] vrf.subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') print("\nFinal mux") mkv = MKVFile() mkv.add_track(MKVTrack(OUTPUT, language="jpn", default_track=True)) mkv.add_track(MKVTrack(A_ENC_CUT, language="jpn", default_track=True)) mkv.chapters(CHAPTER, "jpn") mkv.mux(OUTPUT_FINAL)
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vrf.gk(SRC_CUT, QPFILE) print('\n\n\nVideo encode') vrf.encode(filtered, X264, OUTPUT, **X264_ARGS) print('\n\n\nAudio extraction') eac3to_args = ['eac3to', SRC, '2:', A_SRC, '-log=NUL'] vrf.subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cut') eztrim(SRC_CLIP, (FRAME_START, FRAME_END), A_SRC, mkvextract_path='mkvextract') print('\n\n\nAudio encode') flac_args = ['flac', A_SRC_CUT, '-8'] vrf.subprocess.run(flac_args, text=True, check=True, encoding='utf-8') print('\nFinal mux') mkv = MKVFile() mkv.add_track(MKVTrack(OUTPUT, language='jpn', default_track=True)) mkv.add_track( MKVTrack(A_SRC_CUT[:-3] + 'flac', language='jpn', default_track=True)) mkv.mux(OUTPUT_FINAL)
def do_encode(clip): """Compression with x26X""" if not os.path.isfile(JPBD.output): print('\n\n\nVideo encoding') bits = clip.format.bits_per_sample x265_cmd = f'x265 -o {JPBD.output} - --y4m' + ' ' x265_cmd += f'--csv {JPBD.name}_log_x265.csv --csv-log-level 2' + ' ' x265_cmd += '--preset slower' + ' ' x265_cmd += f'--frames {clip.num_frames} --fps {clip.fps_num}/{clip.fps_den} --output-depth {bits}' + ' ' x265_cmd += '--rd 3 --no-rect --no-amp --rskip 1 --tu-intra-depth 2 --tu-inter-depth 2 --tskip' + ' ' x265_cmd += '--merange 48 --weightb' + ' ' x265_cmd += '--no-strong-intra-smoothing' + ' ' x265_cmd += '--psy-rd 2.0 --psy-rdoq 1.5 --no-open-gop --keyint 240 --min-keyint 23 --scenecut 60 --rc-lookahead 60 --bframes 16' + ' ' x265_cmd += '--crf 15 --aq-mode 3 --aq-strength 0.90 --cbqpoffs -2 --crqpoffs -2 --qcomp 0.70' + ' ' x265_cmd += '--deblock=-2:-2 --no-sao --no-sao-non-deblock' + ' ' x265_cmd += f'--sar 1 --range limited --colorprim 1 --transfer 1 --colormatrix 1 --min-luma {str(16<<(bits - 8))} --max-luma {str(235<<(bits - 8))}'# + ' ' print("Encoder command: ", " ".join(shlex.split(x265_cmd)), "\n") process = subprocess.Popen(shlex.split(x265_cmd), stdin=subprocess.PIPE) clip.output(process.stdin, y4m=True, progress_update=lambda value, endvalue: print(f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '3:', JPBD.a_src.format(1), '4:', JPBD.a_src.format(2), '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src.format(1), JPBD.a_src_cut.format(1)) eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src.format(2), JPBD.a_src_cut.format(2)) print('\n\n\nAudio encoding') qaac_args = ['qaac', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') qaac_args = ['qaac', JPBD.a_src_cut.format(2), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(2)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') ffprobe_args = ['ffprobe', '-loglevel', 'quiet', '-show_entries', 'format_tags=encoder', '-print_format', 'default=nokey=1:noprint_wrappers=1', JPBD.a_enc_cut.format(1)] encoder_name = subprocess.check_output(ffprobe_args, shell=True, encoding='utf-8') f = open("tags_aac.xml", 'w') f.writelines(['<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}</String>', '</Simple>', '</Tag>', '</Tags>']) f.close() print('\nFinal muxing') mkv_args = ['mkvmerge', '-o', JPBD.output_final, '--track-name', '0:HEVC BDRip by Vardë@Raws-Maji', '--language', '0:jpn', JPBD.output, '--tags', '0:tags_aac.xml', '--track-name', '0:AAC 2.0', '--language', '0:jpn', JPBD.a_enc_cut.format(1), '--tags', '0:tags_aac.xml', '--track-name', '0:AAC 2.0 Commentary', '--language', '0:jpn', JPBD.a_enc_cut.format(2), '--chapter-language', 'jpn', '--chapters', JPBD.chapter] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') # Clean up files = [JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1), 'tags_aac.xml'] for file in files: if os.path.exists(file): os.remove(file)
def do_encode(clip: vs.VideoNode) -> None: """Compression with x26X""" print('\n\n\nVideo encoding') print('\n\n\nVideo encoding') x265_cmd = f'x265 -o {JPBD.output} - --y4m' + ' ' x265_cmd += f'--csv {JPBD.name}_log_x265.csv --csv-log-level 2' + ' ' x265_cmd += '--frame-threads 8 --pmode --pme --preset slower' + ' ' x265_cmd += f'--frames {clip.num_frames} --fps {clip.fps_num/clip.fps_den} --output-depth 10' + ' ' x265_cmd += '--rd 3 --no-rect --no-amp --rskip 1 --tu-intra-depth 2 --tu-inter-depth 2 --tskip' + ' ' x265_cmd += '--merange 48 --weightb' + ' ' x265_cmd += '--no-strong-intra-smoothing' + ' ' x265_cmd += '--psy-rd 2.0 --psy-rdoq 1.0 --no-open-gop --keyint 360 --min-keyint 12 --scenecut 45 --rc-lookahead 120 --bframes 16' + ' ' x265_cmd += '--crf 15 --aq-mode 3 --aq-strength 0.85 --qcomp 0.70' + ' ' x265_cmd += '--deblock=-1:-1 --no-sao --no-sao-non-deblock' + ' ' x265_cmd += f'--sar 1 --range limited --colorprim 1 --transfer 1 --colormatrix 1 --min-luma {str(16<<2)} --max-luma {str(235<<2)}' # + ' ' print("Encoder command: ", " ".join(shlex.split(x265_cmd)), "\n") process = subprocess.Popen(shlex.split(x265_cmd), stdin=subprocess.PIPE) clip.output( process.stdin, y4m=True, progress_update=lambda value, endvalue: print( f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) print('\n\n\nAudio encoding') ffmpeg_args = [ 'ffmpeg', '-i', JPBD.a_src_cut.format(1), '-compression_level', '12', '-lpc_type', 'cholesky', '-lpc_passes', '3', '-exact_rice_parameters', '1', JPBD.a_enc_cut.format(1) ] subprocess.run(ffmpeg_args, text=True, check=True, encoding='utf-8') print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', JPBD.output_final, '--track-name', '0:HEVC BDRip by Vardë@Raws-Maji', '--language', '0:jpn', JPBD.output, '--track-name', '0:FLAC 2.0', '--language', '0:jpn', JPBD.a_enc_cut.format(1) ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') # Clean up files = [JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1)] for file in files: if os.path.exists(file): os.remove(file)
def _audio_getter(self: EncodeGoBrrr) -> None: assert self.file.a_src.format(1) if not Path(self.file.a_src.format(1)).exists(): BasicTool( 'mkvextract', [self.file.src, 'tracks', f'1:{self.file.a_src.format(1)}']) assert self.file.a_src_cut.format(1) if not Path(self.file.a_src_cut.format(1)).exists(): eztrim(self.file.clip, (self.file.frame_start, self.file.frame_end), self.file.a_src.format(1), self.file.a_src_cut.format(1))
def trim_audio(self, ftrim: Optional[acsuite.types.Trim] = None) -> str: streams = sorted(self.src.audio_streams(), key=lambda s: s.stream_index) if len(streams) == 0: return "" trims = self.src.audio_src() ffmpeg = acsuite.ffmpeg.FFmpegAudio() tlist: List[str] = [] for t in trims: audio_cut = acsuite.eztrim( t.path, t.trim or (0, None), ref_clip=self.src.audio_ref(), outfile=get_temp_filename(prefix=AUDIO_PFX + "cut_", suffix=".mka"), streams=[s.stream_index for s in streams])[0] self.cleanup.add(audio_cut) tlist.append(audio_cut) if len(tlist) > 1: audio_cut = ffmpeg.concat(*tlist) self.cleanup.add(audio_cut) if ftrim: audio_cut = acsuite.eztrim(audio_cut, ftrim, ref_clip=self.src.source(), outfile=get_temp_filename( prefix=AUDIO_PFX + "fcut_", suffix=".mka"))[0] self.cleanup.add(audio_cut) if len(streams) > 1: splits = [ get_temp_filename(prefix=AUDIO_PFX + "split_", suffix=".mka") for _ in range(0, len(streams)) ] ffmpeg.split(audio_cut, splits) self.cleanup |= set(splits) encode = [ streams[i].codec.encode_audio(f) for i, f in enumerate(splits) ] self.cleanup |= set(encode) audio_cut = get_temp_filename(prefix=AUDIO_PFX + "join_", suffix=".mka") ffmpeg.join(audio_cut, *encode) else: audio_cut = streams[0].codec.encode_audio(audio_cut) self.cleanup.add(audio_cut) return audio_cut
def _audio_getter(self: EncodeGoBrrr): assert self.file.a_src if not Path(self.file.a_src).exists(): BasicTool('eac3to', [self.file.src, '2:', self.file.a_src, '-log=NUL']) assert self.file.a_src_cut if not Path(self.file.a_src_cut).exists(): eztrim(self.file.clip, (self.file.frame_start, self.file.frame_end), self.file.a_src, self.file.a_src_cut) assert self.file.a_enc_cut if not Path(self.file.a_enc_cut).exists(): AudioEncoder('ffmpeg', Path('love_live_common/flac_settings'), self.file)
def do_encode(clip: vs.VideoNode)-> None: """Compression with x264""" print('\n\n\nVideo encoding') x265_args = [ X265, "--y4m", "--frames", f"{clip.num_frames}", "--sar", "1", "--output-depth", "10", "--colormatrix", "bt709", "--colorprim", "bt709", "--transfer", "bt709", "--range", "limited", "--min-luma", str(16<<2), "--max-luma", str(235<<2), "--fps", f"{clip.fps_num}/{clip.fps_den}", "-o", JPBD.output, "-", "--frame-threads", "16", "--no-sao", "--fades", "--preset", "slower", "--crf", "14.5", "--qcomp", "0.72", "--bframes", "16", "--psy-rd", "2.0", "--psy-rdoq", "1.0", "--deblock", "-1:-1", "--rc-lookahead", "96", "--min-keyint", "23", "--keyint", "360", "--aq-mode", "3", "--aq-strength", "1.0" ] print("Encoder command: ", " ".join(x265_args), "\n") process = subprocess.Popen(x265_args, stdin=subprocess.PIPE) clip.output(process.stdin, y4m=True, progress_update=lambda value, endvalue: print(f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') mka = MKVFile() mka.add_track(MKVTrack(JPBD.src, 1)) mka.mux(JPBD.a_src) print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, mkvextract_path='mkvextract') print('\n\n\nAudio encoding') qaac_args = ['qaac64', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1)] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') print('\nFinal muxing') mkv = MKVFile() mkv.add_track(MKVTrack(JPBD.output, language='jpn', default_track=True)) mkv.add_track(MKVTrack(JPBD.a_enc_cut.format(1), language='jpn', default_track=True)) mkv.chapters(JPBD.chapter, 'jpn') mkv.mux(JPBD.output_final)
def do_encode(clip): """Compression with x26X""" if not os.path.isfile(WEB.output): print('\n\n\nVideo encoding') bits = clip.format.bits_per_sample x265_cmd = f'x265 -o {WEB.output} - --y4m' + ' ' x265_cmd += f'--csv {WEB.name}_log_x265.csv --csv-log-level 2' + ' ' x265_cmd += '--preset slower' + ' ' x265_cmd += f'--frames {clip.num_frames} --fps {clip.fps_num}/{clip.fps_den} --output-depth {bits}' + ' ' x265_cmd += '--rd 3 --no-rect --no-amp --rskip 1 --tu-intra-depth 2 --tu-inter-depth 2 --tskip' + ' ' x265_cmd += '--merange 48 --weightb' + ' ' # x265_cmd += '--no-strong-intra-smoothing' + ' ' x265_cmd += '--psy-rd 1.85 --psy-rdoq 1.5 --no-open-gop --keyint 240 --min-keyint 23 --scenecut 40 --rc-lookahead 48 --bframes 16' + ' ' x265_cmd += '--crf 16 --aq-mode 3 --aq-strength 0.85 --cbqpoffs -2 --crqpoffs -2 --qcomp 0.70' + ' ' x265_cmd += '--deblock=1:-1 --no-sao --no-sao-non-deblock' + ' ' x265_cmd += f'--sar 1 --range limited --colorprim 1 --transfer 1 --colormatrix 1 --min-luma {str(16<<(bits - 8))} --max-luma {str(235<<(bits - 8))}' print("Encoder command: ", " ".join(shlex.split(x265_cmd)), "\n") process = subprocess.Popen(shlex.split(x265_cmd), stdin=subprocess.PIPE) clip.output( process.stdin, y4m=True, progress_update=lambda value, endvalue: print( f"\rVapourSynth: {value}/{endvalue} ~ {100 * value // endvalue}% || Encoder: ", end="")) process.communicate() print('\n\n\nAudio extraction') mkv_args = ['mkvextract', WEB.src, 'tracks', f'1:{WEB.a_src}'] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(WEB.src_clip, (WEB.frame_start, WEB.frame_end), WEB.a_src, WEB.a_src_cut.format(1)) print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', WEB.output_final, '--track-name', '0:HEVC WEBRip by Vardë@Natsumi-no-Sekai', '--language', '0:jpn', WEB.output, '--track-name', '0:AAC 2.0', '--language', '0:jpn', WEB.a_src_cut.format(1) ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8')
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vdf.gk(JPBD.src_cut, JPBD.qpfile) print('\n\n\nVideo encoding') vdf.encode(filtered, X264, JPBD.output, **X264_ARGS) print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) print('\n\n\nAudio encoding') qaac_args = [ 'qaac', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1) + '.m4a' ] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') opus_args = [ 'opusenc', '--bitrate', '192', JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1) + '.opus' ] subprocess.run(opus_args, text=True, check=True, encoding='utf-8') print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_aac.mkv', '--language', '0:jpn', JPBD.output, '--language', '0:jpn', JPBD.a_enc_cut.format(1) + '.m4a' ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_opus.mkv', '--language', '0:jpn', JPBD.output, '--language', '0:jpn', JPBD.a_enc_cut.format(1) + '.opus' ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8')
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vdf.gk(JPBD.src_cut, JPBD.qpfile) print('\n\n\nVideo encoding') vdf.encode(filtered, X264, JPBD.output, **X264_ARGS) print('\n\n\nAudio extraction') eac3to_args = ['eac3to', JPBD.src, '2:', JPBD.a_src, '-log=NUL'] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting') eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src, JPBD.a_src_cut.format(1)) print('\n\n\nAudio encoding') qaac_args = [ 'qaac', JPBD.a_src_cut.format(1), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(1) + '.m4a' ] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') ffprobe_args = [ 'ffprobe', '-loglevel', 'quiet', '-show_entries', 'format_tags=encoder', '-print_format', 'default=nokey=1:noprint_wrappers=1', JPBD.a_enc_cut.format(1) + '.m4a' ] encoder_name = subprocess.check_output(ffprobe_args, shell=True, encoding='utf-8') f = open("tags_aac.xml", 'w') f.writelines([ '<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}</String>', '</Simple>', '</Tag>', '</Tags>' ]) f.close() opus_args = [ 'opusenc', '--bitrate', '192', JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1) + '.opus' ] subprocess.run(opus_args, text=True, check=True, encoding='utf-8') opus_args = ['opusenc', '-V'] encoder_name = subprocess.check_output(opus_args, shell=True, encoding='utf-8').splitlines()[0] f = open("tags_opus.xml", 'w') f.writelines([ '<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}, VBR 192k</String>', '</Simple>', '</Tag>', '</Tags>' ]) f.close() print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_aac.mkv', '--language', '0:jpn', JPBD.output, '--tags', '0:tags_aac.xml', '--language', '0:jpn', JPBD.a_enc_cut.format(1) + '.m4a' ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_opus.mkv', '--language', '0:jpn', JPBD.output, '--tags', '0:tags_opus.xml', '--language', '0:jpn', JPBD.a_enc_cut.format(1) + '.opus' ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') _ = [ os.remove(f) for f in [ JPBD.a_src, JPBD.a_src_cut.format(1), JPBD.a_enc_cut.format(1) + '.m4a', JPBD.a_enc_cut.format(1) + '.opus', 'tags_aac.xml', 'tags_opus.xml' ] ]
#!/usr/bin/env python3 import ntpath import lvsfunc as lvf from acsuite import eztrim path = r'BDMV/[KUNO-DIY][BDMV][CLANNAD][Blu-ray BOX Disc 1-5 Fin]/CLANNAD_1/BDMV/STREAM/00003.m2ts' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (0, -48), path, f"{ntpath.basename(__file__)[3:-3]}_cut.mka", ffmpeg_path='') # noqa
#!/usr/bin/env python3 import ntpath import os import lvsfunc as lvf from acsuite import eztrim path = r'BDMV/[BDMV][200129][Kimetsu no Yaiba][Vol.7]/BDMV/STREAM/00005.m2ts' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (0, -24), f"{os.path.splitext(path)[0]}.wav", f"{ntpath.basename(__file__)[3:-3]}_cut.wav")
#!/usr/bin/env python3 import os from acsuite import eztrim import lvsfunc as lvf # Note: NCs for this show have AC3 audio, not DTS-HD! path = r'BDMV/KIXA_90889/BDMV/STREAM/00007.m2ts' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (24, -24), f"{os.path.splitext(path)[0]}.wav", f"{__file__[:-3]}_cut.wav")
#!/usr/bin/env python3 import os from acsuite import eztrim import lvsfunc as lvf path = r'DVDISO/(DVDISO)(アニメ) 鉄腕バーディー DECODE VOLUME02 (081022)(iso+mds+jpg)/TETSUWAN_BIRDY_02.d2v' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (49055, 91628), f"{os.path.splitext(path)[0]} Ta0 stereo 1536 kbps DELAY 0 ms.w64", f"{__file__[:-3]}_cut.wav")
#!/usr/bin/env python3 import ntpath import os import lvsfunc as lvf from acsuite import eztrim path = r'03/[HorribleSubs] Kaguya-sama wa Kokurasetai S2 - 03 [1080p].mkv' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (289, 0), f"{os.path.splitext(path)[0]}.mkv", f"{ntpath.basename(__file__)[3:-3]}_cut.aac", ffmpeg_path='')
#!/usr/bin/env python3 import ntpath import os import lvsfunc as lvf from acsuite import eztrim ep = "02" # The only annoying thing about using SubsPlease over Erai now is the CRC path = f'{ep}/[SubsPlease] Majo no Tabitabi - {ep} (1080p) [66DF9727].mkv' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (240, 0), path, f"{ep}/{ntpath.basename(__file__)[3:-3]}_cut.mka", ffmpeg_path='')
#!/usr/bin/env python3 import os from acsuite import eztrim import lvsfunc as lvf path = r'[BDMV]冴えない彼女の育てかた♭Vol.01~Vol.06/[BDMV]冴えない彼女の育てかた♭ VOL.05/BDMV/STREAM/00002.m2ts' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (0, 32847), f"{os.path.splitext(path)[0]}.wav", f"{__file__[:-3]}_cut.wav")
#!/usr/bin/env python3 import os from acsuite import eztrim import lvsfunc as lvf path = r'BDMV/[BDMV][190402][マナリアフレンズ II]/BD/BDMV/STREAM/00012.m2ts' src = lvf.src(path) if __name__ == "__main__": eztrim(src, (1988, 2984), f"{os.path.splitext(path)[0]}.wav", f"{__file__[3:-3]}_cut.wav")
#!/usr/bin/env python3 import ntpath import lvsfunc as lvf from acsuite import eztrim path = f'BDMV/AKUDWAFTER/BDMV/STREAM/00002.m2ts' src = lvf.src(path) if __name__ == "__main__": # Twice because there's both a 2.0 and a 5.1 track eztrim(src, (24, -24), f"{path[:-5]}_1.wav", f"{ntpath.basename(__file__)[3:-3]}_51_cut.wav") eztrim(src, (24, -24), f"{path[:-5]}_2.wav", f"{ntpath.basename(__file__)[3:-3]}_20_cut.wav")
audio_out = source[:-3] + 'aac' tempfile = source[:-3] + '_temp.aac' # process audio demux_cmd = [ 'ffmpeg', '-hide_banner', '-loglevel', '16', '-i', source, '-map', '0:a:0', '-c', 'copy', tempfile ] subprocess.run(demux_cmd) if ed: clip = vs.core.lsmas.LWLibavSource(source) trim = [(0, ed), (ed + 2152, ed + 2157), (ed, ed + 2152), (ed + 2157, None)] # shifting ~210ms of silence from end of the ED to its beginning for better sync with video. if this desync was an artistic choice, it was _not_ a good one. acsuite.eztrim(clip, trim, tempfile, audio_out, quiet=True) os.remove(tempfile) os.remove(source + '.lwi') else: os.rename(tempfile, audio_out) # process video filter_process = subprocess.Popen(['vspipe', '--y4m', script, '-'], stdout=subprocess.PIPE) encode_process = subprocess.Popen(['x264'] + encode_args.split() + ['--demuxer', 'y4m', '-o', video_out, '-'], stdin=filter_process.stdout) filter_process.stdout.close() encode_process.communicate() # muxing
def do_encode(filtered): """Compression with x264""" print('Qpfile generating') vdf.gk(JPBD.src_cut, JPBD.qpfile) print('\n\n\nVideo encoding') vdf.encode(filtered, X264, JPBD.output, **X264_ARGS) print('\n\n\nAudio extraction') eac3to_args = [ 'eac3to', JPBD.src, '2:', JPBD.a_src.format(1), # '3:', JPBD.a_src.format(2), '-log=NUL' ] subprocess.run(eac3to_args, text=True, check=True, encoding='utf-8') print('\n\n\nAudio cutting & encoding') # for i in range(1, 2+1): for i in range(1, 1 + 1): eztrim(JPBD.src_clip, (JPBD.frame_start, JPBD.frame_end), JPBD.a_src.format(i), JPBD.a_src_cut.format(i)) # Encode in AAC qaac_args = [ 'qaac', JPBD.a_src_cut.format(i), '-V', '127', '--no-delay', '-o', JPBD.a_enc_cut.format(i) + '.m4a' ] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') # Encode in Opus opus_args = [ 'opusenc', '--bitrate', '192', JPBD.a_src_cut.format(i), JPBD.a_enc_cut.format(i) + '.opus' ] subprocess.run(opus_args, text=True, check=True, encoding='utf-8') # Blanck cut and encode eztrim(JPBD.src_clip, (0, ENDCARD_LENGTH), 'blank.wav', 'blank_cut.wav') qaac_args = [ 'qaac', 'blank_cut.wav', '-V', '127', '--no-delay', '-o', 'blank_cut.m4a' ] subprocess.run(qaac_args, text=True, check=True, encoding='utf-8') opus_args = [ 'opusenc', '--bitrate', '192', 'blank_cut.wav', 'blank_cut.opus' ] subprocess.run(opus_args, text=True, check=True, encoding='utf-8') # Recup encoder name ffprobe_args = [ 'ffprobe', '-loglevel', 'quiet', '-show_entries', 'format_tags=encoder', '-print_format', 'default=nokey=1:noprint_wrappers=1', JPBD.a_enc_cut.format(1) + '.m4a' ] encoder_name = subprocess.check_output(ffprobe_args, shell=True, encoding='utf-8') fil = open("tags_aac.xml", 'w') fil.writelines([ '<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}</String>', '</Simple>', '</Tag>', '</Tags>' ]) fil.close() opus_args = ['opusenc', '-V'] encoder_name = subprocess.check_output(opus_args, shell=True, encoding='utf-8').splitlines()[0] fil = open("tags_opus.xml", 'w') fil.writelines([ '<?xml version="1.0"?>', '<Tags>', '<Tag>', '<Targets>', '</Targets>', '<Simple>', '<Name>ENCODER</Name>', f'<String>{encoder_name}, VBR 192k</String>', '</Simple>', '</Tag>', '</Tags>' ]) fil.close() print('\nFinal muxing') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_aac.mkv', '--language', '0:jpn', '--track-name', '0:AVC BDRip by Vardë@YameteTomete', JPBD.output, '--tags', '0:tags_aac.xml', '--language', '0:jpn', '--track-name', '0:AAC 2.0', JPBD.a_enc_cut.format(1) + '.m4a', '+', 'blank_cut.m4a', # '--tags', '0:tags_aac.xml', '--language', '0:jpn', '--track-name', '0:AAC 2.0 Commentary', JPBD.a_enc_cut.format(2) + '.m4a', '+', 'blank_cut.m4a', '--chapter-language', 'en', '--chapters', JPBD.chapter ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') mkv_args = [ 'mkvmerge', '-o', JPBD.name + '_opus.mkv', '--language', '0:jpn', '--track-name', '0:AVC BDRip by Vardë@YameteTomete', JPBD.output, '--tags', '0:tags_opus.xml', '--language', '0:jpn', '--track-name', '0:Opus 2.0', JPBD.a_enc_cut.format(1) + '.opus', '+', 'blank_cut.opus', # '--tags', '0:tags_opus.xml', '--language', '0:jpn', '--track-name', '0:Opus 2.0 Commentary', JPBD.a_enc_cut.format(2) + '.opus', '+', 'blank_cut.opus', '--chapter-language', 'en', '--chapters', JPBD.chapter ] subprocess.run(mkv_args, text=True, check=True, encoding='utf-8') # Clean up files = [ 'tags_aac.xml', 'tags_opus.xml', 'blank_cut.wav', 'blank_cut.m4a', 'blank_cut.opus' ] for file in files: if os.path.exists(file): os.remove(file) # for i in range(1, 2+1): for i in range(1, 1 + 1): files = [ JPBD.a_src.format(i), JPBD.a_src_cut.format(i), JPBD.a_enc_cut.format(i) + '.m4a', JPBD.a_enc_cut.format(i) + '.opus' ] for file in files: if os.path.exists(file): os.remove(file)
path = r'BDMV/[BDMV][190402][マナリアフレンズ II]/BD/BDMV/STREAM/00009.m2ts' src = lvf.src(path) prev_start = 16688 if __name__ == "__main__": files = [f"{__file__[:-3]}_{i}_cut.wav" for i in 'ABCD'] trims = [(24, prev_start), (0, 24), (prev_start + 240, 0), (prev_start, prev_start + 240)] print("\n[*] Trimming tracks") for f, t in zip(files, trims): print(f" [+] Trimming {f} with trims {t}") eztrim(src, t, f"{os.path.splitext(path)[0]}.wav", f, quiet=True) print("\n[*] Writing concact file") concat = open(f"{__file__[:-3]}_concat.txt", "w") for f in files: print(f" [+] Adding {f}") concat.write(f"file {f}\n") concat.close() print("\n[*] Concatinating trimmed tracks") subprocess.run([ "ffmpeg", "-f", "concat", "-i", f"{__file__[:-3]}_concat.txt", "-loglevel", "panic", "-stats", "-c", "copy", f"{__file__[3:-3]}_cut.wav" ]) print(" [+] Tracks successfully concatinated")