import tkinter as tk
from tkinter import filedialog, messagebox
import av
import os
def convert_video(input_file, output_file):
# 打开输入视频流
input_container = av.open(input_file)
# 创建输出视频流
output_container = av.open(output_file, 'w')
# 添加视频流并设置参数
video_stream = output_container.add_stream('h264', rate=60)
video_stream.height = 4320
video_stream.width = 7680
video_stream.pix_fmt = 'yuv420p'
# 添加音频流
audio_stream = None
for stream in input_container.streams:
if stream.type == 'audio':
audio_stream = output_container.add_stream('aac', rate=stream.rate)
audio_stream.channels = stream.channels
break
# 逐帧处理视频
for frame in input_container.decode(video=0):
# 调整大小为8K
frame_resized = frame.reformat(width=7680, height=4320)
# 写入到输出容器
for packet in video_stream.encode(frame_resized):
output_container.mux(packet)
# 处理未写入的视频帧
for packet in video_stream.encode():
output_container.mux(packet)
# 逐帧处理音频
if audio_stream:
for frame in input_container.decode(audio=0):
# 将音频帧写入输出容器
for packet in audio_stream.encode(frame):
output_container.mux(packet)
# 处理未写入的音频帧
for packet in audio_stream.encode():
output_container.mux(packet)
# 关闭容器
input_container.close()
output_container.close()
messagebox.showinfo("完成", "视频转换成功,已维持原视频时长!")
def open_file():
input_file = filedialog.askopenfilename(
title="选择输入视频",
filetypes=(("MP4 文件", "*.mp4"), ("所有文件", "*.*"))
)
if input_file:
# 获取输入文件的基础名称和扩展名
base_name, ext = os.path.splitext(os.path.basename(input_file))
# 创建新的输出文件名
output_file = filedialog.asksaveasfilename(
title="保存输出视频",
defaultextension=".mp4",
initialfile=f"{base_name}_8k_60fps{ext}",
filetypes=(("MP4 文件", "*.mp4"), ("所有文件", "*.*"))
)
if output_file:
convert_video(input_file, output_file)
# 创建主窗口
root = tk.Tk()
root.title("视频转换器")
root.geometry("300x150")
# 创建按钮以打开文件
btn_open = tk.Button(root, text="打开视频文件", command=open_file)
btn_open.pack(pady=20)
# 启动应用程序
root.mainloop()
首先,确保安装必要的库:
pip install av tkinter