melhorado explorer com teclas de atalhos funcionando e configurações de perfis do ffmpeg
This commit is contained in:
@@ -15,7 +15,6 @@ class FFmpegEngine:
|
||||
state.log("⚠️ AVISO: Nenhum perfil FFmpeg ativo! Usando defaults.")
|
||||
|
||||
def get_file_info(self, filepath):
|
||||
"""Extrai metadados do arquivo usando ffprobe"""
|
||||
cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', '-show_format', filepath]
|
||||
try:
|
||||
output = subprocess.check_output(cmd).decode('utf-8')
|
||||
@@ -34,68 +33,74 @@ class FFmpegEngine:
|
||||
metadata = self.get_file_info(input_file)
|
||||
if not metadata: raise Exception("Arquivo inválido.")
|
||||
|
||||
# Descobre o codec de vídeo de entrada
|
||||
# Info de entrada
|
||||
video_stream = next((s for s in metadata['streams'] if s['codec_type'] == 'video'), None)
|
||||
input_codec = video_stream['codec_name'] if video_stream else 'unknown'
|
||||
|
||||
# --- DETECÇÃO DE HARDWARE (Haswell Safe Logic) ---
|
||||
# Intel 4ª Geração (Haswell):
|
||||
# Decode: Suporta H264, MPEG2. NÃO SUPORTA HEVC/x265.
|
||||
|
||||
can_hw_decode = False
|
||||
hw_decodable_codecs = ['h264', 'mpeg2video', 'vc1', 'mjpeg']
|
||||
|
||||
if 'vaapi' in p.video_codec:
|
||||
if input_codec in hw_decodable_codecs:
|
||||
can_hw_decode = True
|
||||
else:
|
||||
state.log(f"⚙️ Modo Híbrido (Haswell): CPU lendo {input_codec} -> GPU codificando.")
|
||||
|
||||
cmd = ['ffmpeg', '-y']
|
||||
video_filters = []
|
||||
|
||||
# --- INPUT (LEITURA) ---
|
||||
if 'vaapi' in p.video_codec:
|
||||
# Inicializa o dispositivo VAAPI
|
||||
# --- LÓGICA MODULAR DE HARDWARE ---
|
||||
|
||||
# 1. INTEL/AMD VAAPI
|
||||
if p.hardware_type == 'vaapi':
|
||||
# Setup do Device (Sempre necessário para VAAPI)
|
||||
cmd.extend(['-init_hw_device', 'vaapi=intel:/dev/dri/renderD128'])
|
||||
cmd.extend(['-filter_hw_device', 'intel'])
|
||||
|
||||
if can_hw_decode:
|
||||
# Se a GPU sabe ler, usa aceleração total
|
||||
# Verificação de Modo Híbrido (Intel 4th Gen / Compatibilidade)
|
||||
use_hw_decode = True
|
||||
|
||||
if p.hybrid_decode:
|
||||
# Lista de codecs seguros para Haswell
|
||||
safe_codecs = ['h264', 'mpeg2video', 'vc1', 'mjpeg']
|
||||
if input_codec not in safe_codecs:
|
||||
use_hw_decode = False
|
||||
state.log(f"⚙️ Modo Híbrido Ativado: CPU decodificando {input_codec} -> GPU codificando.")
|
||||
|
||||
# Aplica Input HW Accel se permitido
|
||||
if use_hw_decode:
|
||||
cmd.extend(['-hwaccel', 'vaapi'])
|
||||
cmd.extend(['-hwaccel_output_format', 'vaapi'])
|
||||
cmd.extend(['-hwaccel_device', 'intel'])
|
||||
else:
|
||||
# Se não usar HW decode, precisa subir pra GPU antes de encodar
|
||||
video_filters.append('format=nv12,hwupload')
|
||||
|
||||
elif 'qsv' in p.video_codec:
|
||||
cmd.extend(['-hwaccel', 'qsv', '-c:v', 'h264_qsv'])
|
||||
elif 'nvenc' in p.video_codec:
|
||||
# 2. NVIDIA NVENC (Se suportado pelo container/host)
|
||||
elif p.hardware_type == 'nvenc':
|
||||
cmd.extend(['-hwaccel', 'cuda'])
|
||||
# Nvidia geralmente aguenta tudo, mas se precisar de resize, adiciona filtros aqui
|
||||
|
||||
# 3. INTEL QSV (QuickSync Proprietário)
|
||||
elif p.hardware_type == 'qsv':
|
||||
cmd.extend(['-hwaccel', 'qsv', '-c:v', 'h264_qsv'])
|
||||
|
||||
# --- INPUT ---
|
||||
cmd.extend(['-threads', '4', '-i', input_file])
|
||||
|
||||
# --- PROCESSAMENTO E SAÍDA ---
|
||||
# --- VÍDEO OUTPUT ---
|
||||
cmd.extend(['-map', '0:v:0'])
|
||||
video_filters = []
|
||||
|
||||
if p.video_codec == 'copy':
|
||||
cmd.extend(['-c:v', 'copy'])
|
||||
else:
|
||||
# Se for VAAPI Híbrido (leitura CPU), precisamos subir pra GPU
|
||||
if 'vaapi' in p.video_codec and not can_hw_decode:
|
||||
video_filters.append('format=nv12,hwupload')
|
||||
|
||||
# Aplica filtros acumulados
|
||||
if video_filters:
|
||||
cmd.extend(['-vf', ",".join(video_filters)])
|
||||
|
||||
cmd.extend(['-c:v', p.video_codec])
|
||||
|
||||
# Qualidade baseada no encoder
|
||||
if 'vaapi' in p.video_codec:
|
||||
cmd.extend(['-qp', str(p.crf)])
|
||||
cmd.extend(['-qp', str(p.crf)]) # Constant Quality para VAAPI
|
||||
elif 'nvenc' in p.video_codec:
|
||||
cmd.extend(['-cq', str(p.crf), '-preset', p.preset])
|
||||
elif 'libx264' in p.video_codec:
|
||||
else:
|
||||
# CPU / Libx264
|
||||
cmd.extend(['-crf', str(p.crf), '-preset', p.preset])
|
||||
|
||||
# --- ÁUDIO (AAC) ---
|
||||
# --- ÁUDIO (AAC Stereo Compatível) ---
|
||||
allowed_langs = [l.strip().lower() for l in (p.audio_langs or "").split(',')]
|
||||
audio_streams = [s for s in metadata['streams'] if s['codec_type'] == 'audio']
|
||||
|
||||
@@ -122,6 +127,7 @@ class FFmpegEngine:
|
||||
cmd.extend([f'-c:s:{scount}', 'copy'])
|
||||
scount += 1
|
||||
|
||||
# Metadados
|
||||
clean_title = os.path.splitext(os.path.basename(output_file))[0]
|
||||
cmd.extend(['-metadata', f'title={clean_title}'])
|
||||
cmd.append(output_file)
|
||||
|
||||
Reference in New Issue
Block a user