【脚本工具】视频抽帧、添加srt字幕朗读、添加背景音频

1.文章目录

看完本文章,你将能学会一下内容:

  1. 批量视频抽帧;
  2. 添加srt字幕;
  3. 添加srt配音;
  4. 添加背景音乐;
  5. 多视频片段合成一个新视频;

效果:

2.安装依赖

首先安装视频处理库opencv-pythonmoviepy,安装方式pip install xxx。

py文件顶部中导入(下文中使用到的函数将不在赘述导入过程):

from moviepy.editor import VideoFileClip, CompositeAudioClip, CompositeVideoClip, concatenate_videoclips
from cv2 import VideoCapture, VideoWriter, VideoWriter_fourcc, CAP_PROP_FRAME_COUNT

2.视频抽帧

cv2.VideoCapture:

作用:用于从视频文件或摄像头捕获视频帧。

解释:这个函数允许你创建一个视频捕获对象,以便从指定的视频源中读取视频帧。你可以传递视频文件的路径或摄像头的索引作为参数,然后使用它来逐帧读取视频。

cv2.VideoWriter:

作用:用于将视频帧写入到一个新的视频文件中。

解释:这个函数允许你创建一个视频写入对象,以便将视频帧写入到一个新的视频文件中。你可以指定输出文件的名称、视频编解码器、帧速率、分辨率等参数。这在视频编辑和保存处理后的视频时非常有用。

cv2.VideoWriter_fourcc:

作用:用于指定视频编解码器的四字符码(FourCC)。

解释:FourCC 是一个4字节的代码,用于标识视频编解码器。不同的编解码器有不同的FourCC码。通过使用这个函数,你可以选择要在输出视频中使用的编解码器。

CAP_PROP_FRAME_COUNT:

作用:用于获取视频文件中的总帧数。

解释:CAP_PROP_FRAME_COUNT 是 cv2.VideoCapture 对象的一个属性,用于获取视频文件中的总帧数。这对于确定视频的时长以及循环播放视频等操作非常有用。

完整代码块:

# 单个视频抽帧
def video_extract_frame(video_path, out_path):

  # 打开视频文件
  vc = VideoCapture(video_path)

 ...
  if vc.isOpened():
      status, frame = vc.read()
  else:
      status = False
      print("视频没有打开成功!")
      vc.release()
      video.close()
      videoWriter.release()
      return False

  if status:
      for index in trange(total_frame, desc='抽帧进度'):
          # 读取视频帧并写入输出视频
	     	。。。
          videoWriter.write(frame)

  videoWriter.release()
  vc.release()
  video.close()

调用上面的抽帧函数:

video_extract_frame('./test.mp4', 'result.mp4')

如果有多个视频需要抽帧,只需要循环调用即可:


 for index, video_file in enumerate(['1.mp4', '2.mp4', '3.mp4']):
    
    //取出链接中的视频文件名称,例如1,2,3
    ...

    videoTool.video_extract_frame(video_file, out_path)
    print("\n第{}条, 视频抽帧已完成: {}".format(index + 1, out_path))

3.添加srt字幕;

完整示例代码:


# 字幕片段
def generate_textclip(text, width, params, start, duration) -> TextClip:

    return TextClip(
        text,
        font=params.get('font'),
        align=params.get('align'),
        fontsize=params.get('fontsize'),
      	...
    ).set_position((params['location']['x'], params['location']['y'])).set_duration(duration).set_start(start)


# 添加srt字幕
def add_srt(video_clip, params):

  if not (isfile(params["srt_path"]) and params["srt_path"].endswith('.srt')):
      print('字幕仅支持srt格式!')
      return []
  else:
      # 获取视频的宽度和高度
      v_width, v_height = video_clip.w, video_clip.h
      # 所有字幕剪辑
      txts = []
      content = tool.read_srt(params["srt_path"])
      sequences = tool.get_sequences(content)
		...

      srt_text = params["srt_text"]

      for index, line in enumerate(sequences):
          print("字幕生成进度:{}/{}".format(index, max_count))
          if len(line) < 3:
              continue
         ...

          duration = end - start

          txt_srt = generate_textclip(line[2], (v_width - 20), srt_text, start, duration)

          txts.append(txt_srt)

      print("\n字幕转换已完成...")

      return txts

tool.read_srt 代码:

def read_srt(self, path):
    content = ""
    with open(path, 'r', encoding='UTF-8') as f:
        content = f.read()
        return content

tool.get_sequences 代码:

# 字幕拆分
def get_sequences(self, content):
    sequences = content.split('\n\n')
    ...
    # 去除整体空值
    return list(filter(None, sequences))

tool.str_float_time 代码:

# 字符串数字格式化成时间
def str_float_time(self, str):
    str_list = str.split(':')
    hour = int(str_list[0])
    ...
    allTime = hour * 60 * 60 + minute * 60 + second + minsecond / 1000
    return allTime

4.添加背景音乐、srt音频、导出

# frame_video_paths:是抽帧后的视频片段
def merge_videos_with_bgm(params, frame_video_paths, out_path):
    # 用VideoFileClip加载所有输入视频文件
    video_clips = [VideoFileClip(file) for file in frame_video_paths]

    final_clip = concatenate_videoclips(video_clips)

    ...

    video_srt = videoTextTool.add_srt(final_clip, params)


    final_clip.extend(video_srt)

    # 复合视频
    video = CompositeVideoClip(final_clip)

    output_path = path.join(out_path, "result.mp4")

    # 输出最终视频
    video.write_videofile(output_path)


更多爬虫精彩案例、工具源码,搜索公众号“一个努力奔跑的snail
实战完整源码,已上传微信公众号,后期分享更精彩!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玛卡`三少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值