代码拉取完成,页面将自动刷新
import subprocess
from datetime import datetime
from pathlib import Path
from loguru import logger
from tqdm import tqdm
def setup_logging():
log_directory = Path('logs')
log_directory.mkdir(exist_ok=True)
log_filename = datetime.now().strftime("%Y-%m-%d") + ".log"
log_path = log_directory / log_filename
logger.add(log_path, rotation="00:00", retention="7 days")
def merge_mp4_files(directory, output_file):
setup_logging()
logger.info("Starting to merge MP4 files.")
directory = Path(directory)
output_file = Path(output_file)
# 获取目录下的所有 MP4 文件,并按文件名排序
files = sorted(directory.glob('*.mp4'))
logger.info(f"files:{files}")
if not files:
logger.error("No MP4 files found in the directory.")
return
logger.info(f"Found {len(files)} MP4 files to merge.")
# 创建一个临时文件,存储文件列表
list_file_path = directory / 'filelist.txt'
with list_file_path.open('w', encoding='utf-8') as list_file:
for file in files:
list_file.write(f"file '{file.resolve()}'\n")
# 使用 tqdm 显示进度条
total_files = len(files)
with tqdm(total=total_files, desc="Merging files", unit="file") as pbar:
# 使用 ffmpeg 合并文件
command = [
'ffmpeg',
'-f', 'concat',
'-safe', '0',
'-i', str(list_file_path),
'-c', 'copy',
'-loglevel', 'error', # 调整 loglevel 减少日志输出
str(output_file)
]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 读取 ffmpeg 的输出并更新进度条
for line in process.stdout:
if "frame=" in line:
pbar.update(1)
stdout, stderr = process.communicate()
if process.returncode != 0:
logger.error(f"ffmpeg error: {stderr}")
else:
logger.info("MP4 files merged successfully.")
logger.info(f"Output file: {output_file}")
# 删除临时文件
list_file_path.unlink()
if __name__ == "__main__":
directory = Path(r'E:\BaiduNetdiskDownload\孙子兵法与竞争智慧_ev') # 替换为实际目录路径
output_file = directory / '孙子兵法与竞争智慧_ev.mp4' # 合并后的输出文件
merge_mp4_files(directory, output_file)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。