Trim with transition/fade using FFMPEG given a list of timestamps

46 Views Asked by At

I have a video and a list of timestamps that I want to filter.

[
  {
    "timestamp": [10, 20],
    "state": true
  },
  {
    "timestamp": [30, 40],
    "state": false
  },
  {
    "timestamp": [50, 60],
    "state": true
  },
  {
    "timestamp": [70, 80],
    "state": true
  }
]

I have a script like this to trim based on state.

    video_path = Path(video_in.name)
    video_file_name = video_path.stem

    timestamps_to_cut = [
        (timestamps_var[i]['timestamp'][0], timestamps_var[i]['timestamp'][1])
        for i in range(len(timestamps_var)) if timestamps_var[i]['state']]

    between_str = '+'.join(
        map(lambda t: f'between(t,{t[0]},{t[1]})', timestamps_to_cut))

    if timestamps_to_cut:
        video_file = ffmpeg.input(video_path)
        video = video_file.video.filter(
            "select", f'({between_str})').filter("setpts", "N/FRAME_RATE/TB")
        audio = video_file.audio.filter(
            "aselect", f'({between_str})').filter("asetpts", "N/SR/TB")

        output_video = f'./videos_out/{video_file_name}.mp4'
        ffmpeg.concat(video, audio, v=1, a=1).output(
            output_video).overwrite_output().global_args('-loglevel', 'quiet').run()

How can I smooth out this trimming like adding a fade or smoothing transition each time state is false?

0

There are 0 best solutions below