Example #1
0
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
Example #2
0
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
Example #3
0
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