12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import os
- import json
- import time
- import subprocess
- from tqdm import tqdm
- from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
- from utils.caption import generate_srt_file, burn_subtitles_ffmpeg
- from utils.logger_config import setup_logger
- logger = setup_logger(__name__)
- # # 视频裁切-ffmpeg
- # def ffmpeg_cut(input_path, output_path, start_time, end_time):
- # cmd = [
- # 'ffmpeg',
- # '-hwaccel', 'cuvid', # 启用NVIDIA GPU加速(可选)
- # '-i', input_path,
- # '-ss', str(start_time),
- # '-to', str(end_time),
- # '-c:v', 'h264_nvenc', # 使用NVIDIA硬件编码(可选)
- # '-c:a', 'copy',
- # '-c:v', 'copy', # 关键:避免重新编码,直接复制视频流
- # output_path
- # ]
- # subprocess.run(cmd, check=True)
- # # 视频裁切-ffmpeg
- # def cut_video_ffmpeg(input_path, output_path, start_time, duration):
- # command = [
- # 'ffmpeg',
- # '-ss', str(start_time), # 开始时间(格式:00:00:00 或秒数)
- # '-i', input_path,
- # '-t', str(duration), # 持续时间
- # '-c', 'copy', # 直接复制流,不重新编码
- # '-y', # 覆盖输出文件
- # output_path
- # ]
- # subprocess.run(command, check=True)
- # 视频裁切-moviepy
- def moviepy_cut(input_path, output_path, start_time, end_time):
- """
- start_time: xxx sec
- end_time: xxx secs
- """
- logger.info(f"视频裁切中:{output_path} - start: {start_time} - end: {end_time}")
- ffmpeg_extract_subclip(input_path, start_time, end_time, targetname=output_path)
- def video_cut_by_json(json_path, add_caption=False):
- # 读取JSON文件
- try:
- with open(json_path, 'r', encoding='utf-8') as file:
- data = json.load(file)
- except FileNotFoundError:
- print(f"错误: 文件 '{json_path}' 不存在")
- raise
- # 获取原视频路径与视频文件名
- raw_video_path = data["raw_video"]
- raw_video_name = os.path.splitext(os.path.basename(raw_video_path))[0]
- # 读取视频片段元数据,进行:视频片段裁切、SRT文件生成、视频加字幕
- clips_meta = data["oral_dict_list"]
- for i, clip_meta in tqdm(enumerate(clips_meta)):
- # 0、去除timestamp字段
- clip_meta.pop("timestamp", None)
- # 1、提取语句内容,开始时间戳,结束时间戳
- clip_text, clip_start_time, clip_end_time = clip_meta["text"], clip_meta["start"] / 1000, clip_meta["end"] / 1000
- # 2、裁剪视频片段
- clip_name = clip_meta["clip_name"]
- clip_path = "./data/clip_video/" + clip_name
- moviepy_cut(raw_video_path, clip_path, clip_start_time, clip_end_time)
- # 海外线上业务不添加字幕;国内线上业务添加字幕
- if add_caption:
- # 3、生成字幕SRT文件
- srt_list = [(0.0, (clip_end_time - clip_start_time), clip_text)]
- srt_path = "./data/clip_srt/" + clip_name
- generate_srt_file(srt_list, srt_path)
- # 4、视频添加字幕
- output_path = "./output/video_clips/" + clip_name
- burn_subtitles_ffmpeg(clip_path, srt_path, output_path, style_config=None)
- else:
- pass
- if __name__ == "__main__":
- json_path = "new_transcript.json"
- video_cut_by_json(json_path)
|