feat: Add support for AMD hardware encoding via x265-amd codec
This commit is contained in:
parent
72904f4412
commit
3588d9ad14
@ -20,13 +20,20 @@ def encode(input_file, codec, remove_source=False):
|
|||||||
crf = 26
|
crf = 26
|
||||||
folder = "h265"
|
folder = "h265"
|
||||||
extra_params = ["-crf", str(crf)]
|
extra_params = ["-crf", str(crf)]
|
||||||
|
|
||||||
|
elif codec == "x265-amd":
|
||||||
|
ffmpeg_codec = "hevc_amf"
|
||||||
|
folder = "h265"
|
||||||
|
extra_params = ["-quality", "quality"]
|
||||||
|
|
||||||
elif codec == "av1":
|
elif codec == "av1":
|
||||||
ffmpeg_codec = "av1_nvenc"
|
ffmpeg_codec = "av1_nvenc"
|
||||||
cq = 32
|
cq = 32
|
||||||
folder = "av1"
|
folder = "av1"
|
||||||
extra_params = ["-pix_fmt", "yuv420p", "-preset", "p4", "-cq", str(cq), "-rc", "vbr", "-b:v", "0"]
|
extra_params = ["-pix_fmt", "yuv420p", "-preset", "p4", "-cq", str(cq), "-rc", "vbr", "-b:v", "0"]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unsupported codec")
|
raise ValueError(f"Unsupported codec: {codec}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
duration = get_duration(input_file)
|
duration = get_duration(input_file)
|
||||||
@ -52,7 +59,7 @@ def encode(input_file, codec, remove_source=False):
|
|||||||
"-y", output_file
|
"-y", output_file
|
||||||
]
|
]
|
||||||
|
|
||||||
print(f"\n🎬 Encoding {filename} → {folder}/{name}.mkv")
|
print(f"\n🎬 Encoding {filename} → {folder}/{name}.mkv with codec [{ffmpeg_codec}]")
|
||||||
with open(log_file, "w") as log:
|
with open(log_file, "w") as log:
|
||||||
process = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
|
process = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
|
||||||
|
|
||||||
@ -77,7 +84,6 @@ def encode(input_file, codec, remove_source=False):
|
|||||||
|
|
||||||
if process.returncode != 0:
|
if process.returncode != 0:
|
||||||
print(f"\n❌ [Error] FFmpeg failed for {filename}. Check the log: {log_file}")
|
print(f"\n❌ [Error] FFmpeg failed for {filename}. Check the log: {log_file}")
|
||||||
# Clean broken output
|
|
||||||
if os.path.exists(output_file):
|
if os.path.exists(output_file):
|
||||||
os.remove(output_file)
|
os.remove(output_file)
|
||||||
else:
|
else:
|
||||||
@ -105,10 +111,10 @@ def encode_batch(directory, codec, remove_source=False):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description="Encode video(s) to x265 or AV1 with GPU.")
|
parser = argparse.ArgumentParser(description="Encode video(s) to x265 or AV1.")
|
||||||
parser.add_argument("input", nargs="?", help="Path to input file")
|
parser.add_argument("input", nargs="?", help="Path to input file")
|
||||||
parser.add_argument("-d", "--directory", help="Path to a directory for batch encoding")
|
parser.add_argument("-d", "--directory", help="Path to a directory for batch encoding")
|
||||||
parser.add_argument("--codec", choices=["x265", "av1"], default="x265", help="Codec to use (default: x265)")
|
parser.add_argument("--codec", choices=["x265", "x265-amd", "av1"], default="x265", help="Codec to use")
|
||||||
parser.add_argument("--remove-source", action="store_true", help="Remove the source file after successful encoding")
|
parser.add_argument("--remove-source", action="store_true", help="Remove the source file after successful encoding")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user