[FFmpeg-user] xfade works perfectly on any videosrc or video file, but not for images?

Arif Driessen arifd86 at gmail.com
Fri Sep 24 20:31:27 EEST 2021


Hi everyone,

So I'm still working on my filter_complex graph that xfades an image to the
beginning of another video.

And I managed to figure it out, it works for any input source, except for
the two different .png files I have tried. - where the video just stays
stuck on the thumbnail and doesn't xfade.

Does anyone know why? I think it may have something to do with timebase?

Here's a bash script you can use to test it:

#!/bin/bash

IN_VIDEO="input.avi"
THUMBNAIL="thumbnail.png" # <-- use a video source here and it works fine

THUMBNAIL_HOLD_SECONDS=0.4 # INVARIANT: HOLD MUST >= FADE_IN_SECONDS
FADE_IN_SECONDS=0.2
FADE_OUT_SECONDS=0.15

VIDEO_RESOLUTION=$(ffprobe -v error -select_streams v -show_entries
stream=width,height -of csv=s=x:p=0 "${IN_VIDEO}")
PIXEL_FORMAT=$(ffprobe -v error -select_streams v -show_entries
stream=pix_fmt -of csv=s=x:p=0 "${IN_VIDEO}")
SAR=$(ffprobe -v error -select_streams v -show_entries
format=sample_aspect_ratio -of csv=s=x:p=0 "${IN_VIDEO}")

# `bc` doesn't print leading zeros, so let's fix it
calc() { echo "$1" | bc | sed -e 's/^-\./-0./' -e 's/^\./0./'; }

ffmpeg \
  -hide_banner \
  -filter_complex \
  "
    `### DECLARE SOURCES ###`

    `# thumbnail_hold`
    movie=
      filename=${THUMBNAIL},
    scale=${VIDEO_RESOLUTION},
    format=pix_fmts=${PIXEL_FORMAT},
    setsar=${SAR},
    trim=
      start=0:
      duration=${THUMBNAIL_HOLD_SECONDS}
    [thumbnail_hold_v];

    `# intro_a`
    aevalsrc=-2+random(0),
    atrim=
      start=0:
      duration=${THUMBNAIL_HOLD_SECONDS}
    [intro_a];

    `# main_v`
    movie=
      filename=${IN_VIDEO},
    trim=
      start=${TRIM_START_SECONDS}:
      end=${TRIM_END_SECONDS}
    [main_v];

  `# main_a`
    amovie=
    filename=${IN_VIDEO},
    atrim=
      start=${TRIM_START_SECONDS}:
        end=${TRIM_END_SECONDS}
    [main_a];

    `### COMBINE AND OUTPUT ###`

    [thumbnail_hold_v][main_v]
    xfade=
      duration=${FADE_IN_SECONDS}:
      offset=$(calc "${THUMBNAIL_HOLD_SECONDS} - ${FADE_IN_SECONDS}");

    [intro_a][main_a]
    acrossfade=
      duration=${FADE_IN_SECONDS}
      `# (offset not needed here because acrossfade always starts from the
end)`
  " \
  -vcodec libx264 \
  -preset veryfast \
  -crf 18 \
  -pix_fmt yuv420p \
  -acodec aac \
  -b:a 192k \
  -f nut - | ffplay -v error -f nut -


More information about the ffmpeg-user mailing list