Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ************************************************************
- ** Necessário ter instalado o FFMPEG para funcionar ****
- ------------------------------------------------------------
- Arquivo .bat:
- @echo off
- echo Instalando o FFmpeg...
- winget install ffmpeg
- echo.
- echo O FFmpeg foi instalado com sucesso!
- pause
- echo Pressione uma tecla para fechar...
- pause > nul
- ---------------------------------------------------------------------
- ** MP3 para MP4 permite adicionar imagem de fundo (poster/thumbnail) *
- *********************************************************************
- import tkinter as tk
- from tkinter import filedialog, messagebox, ttk
- import subprocess
- import threading
- import os
- class FileConverterApp:
- def __init__(self, master):
- self.master = master
- master.title("Conversor de Arquivos")
- # Criar o menu
- menu_bar = tk.Menu(master)
- file_menu = tk.Menu(menu_bar, tearoff=0)
- file_menu.add_command(label="Sair", command=master.quit)
- menu_bar.add_cascade(label="Arquivo", menu=file_menu)
- help_menu = tk.Menu(menu_bar, tearoff=0)
- help_menu.add_command(label="Sobre", command=self.show_about)
- menu_bar.add_cascade(label="Ajuda", menu=help_menu)
- master.config(menu=menu_bar)
- # Configurações da janela
- window_size = "400x300"
- master.geometry(window_size)
- screen_width = master.winfo_screenwidth()
- screen_height = master.winfo_screenheight()
- x = int((screen_width / 2) - (400 / 2))
- y = int((screen_height / 2) - (300 / 2))
- master.geometry(f"{window_size}+{x}+{y}")
- # Botões para escolher tipo de conversão
- self.mp4_to_mp3_button = tk.Button(master, text="Converter MP4 para MP3", command=self.convert_mp4_to_mp3)
- self.mp4_to_mp3_button.pack(pady=10)
- self.mp3_to_mp4_button = tk.Button(master, text="Converter MP3 para MP4", command=self.convert_mp3_to_mp4)
- self.mp3_to_mp4_button.pack(pady=10)
- # Barra de progresso
- self.progress_bar = ttk.Progressbar(master, mode='indeterminate', length=200)
- # Caixa de texto para exibir o caminho do arquivo convertido
- self.output_path_entry = tk.Entry(master, width=50)
- self.output_path_entry.pack(pady=10)
- self.output_path_entry.config(state='readonly', readonlybackground='white')
- # Adicionar menu de contexto à caixa de texto
- self.context_menu = tk.Menu(master, tearoff=0)
- self.context_menu.add_command(label="Copiar", command=self.copy_to_clipboard)
- self.output_path_entry.bind("<Button-3>", self.show_context_menu)
- # Label para mensagem final
- self.result_label = tk.Label(master, text="")
- self.result_label.pack()
- # Rodapé com a versão do programa
- self.footer_label = tk.Label(master, text="Conversor MP3/MP4 - v5", anchor="w")
- self.footer_label.pack(side="bottom", fill="x")
- def convert_mp4_to_mp3(self):
- mp4_file = filedialog.askopenfilename(filetypes=[("MP4 Files", "*.mp4")])
- if not mp4_file:
- messagebox.showwarning('Aviso', 'Seleção de arquivo MP4 cancelada.')
- return
- # Obter apenas o nome do arquivo sem extensão
- output_file_name = os.path.splitext(os.path.basename(mp4_file))[0]
- output_file = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 Files", "*.mp3")], initialfile=output_file_name)
- if not output_file:
- messagebox.showwarning('Aviso', 'Conversão cancelada.')
- return
- command = [
- 'ffmpeg',
- '-i', mp4_file,
- '-vn',
- '-acodec', 'libmp3lame',
- '-q:a', '4',
- f"{output_file}"
- ]
- self.progress_bar.pack(pady=10)
- self.progress_bar.start(10)
- threading.Thread(target=self.run_ffmpeg_command, args=(command, output_file)).start()
- def convert_mp3_to_mp4(self):
- mp3_file = filedialog.askopenfilename(filetypes=[("MP3 Files", "*.mp3")])
- if not mp3_file:
- messagebox.showwarning('Aviso', 'Seleção de arquivo MP3 cancelada.')
- return
- # Obter apenas o nome do arquivo sem extensão
- output_file_name = os.path.splitext(os.path.basename(mp3_file))[0]
- output_file = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 Files", "*.mp4")], initialfile=output_file_name)
- if not output_file:
- messagebox.showwarning('Aviso', 'Conversão cancelada.')
- return
- image_file = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png")])
- if not image_file:
- messagebox.showwarning('Aviso', 'Seleção de imagem cancelada.')
- return
- command = [
- 'ffmpeg',
- '-loop', '1',
- '-framerate', '2',
- '-i', image_file,
- '-i', mp3_file,
- '-vf', 'scale=trunc(iw/2)*2:trunc(ih/2)*2',
- '-c:v', 'libx264',
- '-tune', 'stillimage',
- '-c:a', 'aac',
- '-b:a', '192k',
- '-shortest',
- '-pix_fmt', 'yuv420p',
- f"{output_file}"
- ]
- self.progress_bar.pack(pady=10)
- self.progress_bar.start(10)
- threading.Thread(target=self.run_ffmpeg_command, args=(command, output_file)).start()
- def run_ffmpeg_command(self, command, output_file):
- try:
- subprocess.run(command, check=True)
- self.output_path_entry.config(state='normal')
- self.output_path_entry.delete(0, tk.END)
- self.output_path_entry.insert(0, output_file)
- self.output_path_entry.config(state='readonly')
- self.result_label.config(text="Conversão concluída!")
- messagebox.showinfo('Sucesso', 'Conversão concluída!')
- except subprocess.CalledProcessError as e:
- self.result_label.config(text=f"Falha na conversão: {e}")
- messagebox.showerror('Erro', f'Falha na conversão: {e}')
- finally:
- self.progress_bar.stop()
- self.progress_bar.pack_forget() # Esconde a barra de progresso após a conclusão
- def show_context_menu(self, event):
- self.context_menu.post(event.x_root, event.y_root)
- def copy_to_clipboard(self):
- self.output_path_entry.select_range(0, tk.END)
- self.output_path_entry.event_generate('<<Copy>>')
- self.output_path_entry.selection_clear()
- def show_about(self):
- messagebox.showinfo("Sobre", "Conversor de arquivos MP3 para vídeo em MP4 e vice-versa\n2024 - Mizuno")
- root = tk.Tk()
- app = FileConverterApp(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement