def add_subtitle_to_video_process(video_id, mode,sub_lang_type='zh-Hans'): """ 将video_id对应的视频的vtt字幕转为ass格式,然后硬入到对应的视频中 :param video_id: :param subtitle_type: (en,zh-Hans,zh-Hans_en) :param mode:指定使用soft还是使用hard的模式将字幕写入视频文件 :return: """ video = Video.objects.get(pk=video_id) # 如果要求写入的中文字幕,而且中文字幕vtt存在 # 则将中文vtt字幕先转为srt,再转为ass,添加式样 if sub_lang_type == 'zh-Hans' and video.subtitle_cn.name: subtitle_file = video.subtitle_cn.path ass_filename = '%s-%s.zh-Hans.ass' % ( get_valid_filename(video.title), video_id) ass_subs_dir = os.path.join(YOUTUBE_DOWNLOAD_DIR, ass_filename) # 则将中文vtt字幕先转为srt,再转为ass,添加式样 subtitle_file = convert_subtilte_format(subtitle_file, ass_subs_dir) subtitle_file = edit_cn_ass_subtitle_style(subtitle_file) # youtube上的 英文vtt字幕包含格式,导致转换成srt字幕再和中文srt字幕合并后有代码 # 暂时不知道该如何处理,所以只合并中文字幕到视频 # elif sub_lang_type == 'en' and video.subtitle_en.name: # subtitle_file = video.subtitle_en.path elif sub_lang_type == 'zh-Hans_en' and video.subtitle_merge.name: # 如果要求写入的中文和英文的合并字幕,而且合并字幕存在 subtitle_file = video.subtitle_merge.path else: # 如果获取不到subtitle_file,则返回False return False if (video.file.name): # 获取到视频文件名称 file_basename = os.path.basename(video.file.path) else: return False # 将文件名称分割为名称和后缀 file_basename_list = os.path.splitext(file_basename) subtitle_video = file_basename_list[0] + '.' + sub_lang_type + \ file_basename_list[1] # 加入字幕的视频文件保存到YOUTUBE_DOWNLOAD_DIR 目录下 subtitle_video = os.path.join(YOUTUBE_DOWNLOAD_DIR, subtitle_video) result = add_subtitle_to_video(video.file.path, subtitle_file, subtitle_video, mode) if result == True and os.path.exists(subtitle_video): # 如何将字幕合并到视频成功,则保存视频文件地址到Video module中 video.subtitle_video_file = subtitle_video video.save(update_fields=['subtitle_video_file']) return True else: print(result) return False
def change_vtt_to_ass_and_edit_style(video_id): """ 将video_id对应的Video对象的subtitle_cn指向的中文vtt格式字幕, 转化为ass格式,保存到subtitle_merge字段 然后修改ass字幕的文字式样 :param video_id: :return: """ ass_path = change_cn_vtt_to_ass(video_id) if ass_path: style_ass_sub = edit_cn_ass_subtitle_style(ass_path) if style_ass_sub: return style_ass_sub
def change_vtt_to_ass_and_edit_style(video_id): """ 将video_id对应的Video对象的中文vtt字幕转换为ass格式 并将中文ass字幕的地址保存到subtitle_merge字段 然后修改ass字幕的文字式样 :param video_id: :return: """ ass_path = change_cn_vtt_to_ass(video_id) if ass_path: style_ass_sub = edit_cn_ass_subtitle_style(ass_path) if style_ass_sub: return style_ass_sub