[Libav-user] Overlay filter has incorrect frame rate

Philippe Gorley philippe.gorley at savoirfairelinux.com
Fri Jul 27 18:10:13 EEST 2018


On 2018-07-27 10:38 AM, Brian C. Wiles wrote:
> Hi,
> 
> 
>    I am trying to programmatically overlay one video onto another, and
> the top (overlaid) video plays at half it's normal frame rate.  If I use
> the ffmpeg command, it works fine. >
> 
>    I started with the doc/examples/transcoding.c example and changed the
> filter initialization.  Here's how I create the filters:
> 
> 
> static int init_filters(char *source, char *source_type)
> {
>      char filter_spec[2000];
>      unsigned int i;
>      int ret;
>      filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
>      if (!filter_ctx)
>          return AVERROR(ENOMEM);
> 
>      for (i = 0; i < ifmt_ctx->nb_streams; i++)
>      {
>          filter_ctx[i].buffersrc_ctx = NULL;
>          filter_ctx[i].buffersink_ctx = NULL;
>          filter_ctx[i].filter_graph = NULL;
>          if (!(ifmt_ctx->streams[i]->codecpar->codec_type ==
>                    AVMEDIA_TYPE_AUDIO ||
>                ifmt_ctx->streams[i]->codecpar->codec_type ==
> AVMEDIA_TYPE_VIDEO))
>              continue;
> 
>          if (ifmt_ctx->streams[i]->codecpar->codec_type ==
> AVMEDIA_TYPE_VIDEO)
>          {
>              sprintf(
>                  filter_spec,
>                  "movie='anim.mp4', "
>                  "scale=w='min(250\\, iw*3/2):h=-1' [wm]; "
>                  "[in][wm]
> overlay=x=main_w-overlay_w-50:y='main_h-overlay_h-50'"
>                  ":enable='between(t,5,10)' [out]");
>          }
>          else
>          {
>              strcpy(filter_spec,
>                     "anull"); /* passthrough (dummy) filter for audio */
>          }
> 
>          ret = init_filter(&filter_ctx[i], stream_ctx[i].dec_ctx,
>                            stream_ctx[i].enc_ctx, filter_spec);
>          if (ret)
>              return ret;
>      }
>      return 0;
> }
> 
>    I have tried using the fps and setpts filters, but that seems like a
> hack to get it to honor the actual frame rate in the file.  Let me know
> if you need more info.  I appreciate any help someone can give me.  Thanks!

Overlay takes frames from each input in timestamp order. It likely 
overlays two frames when they have matching timestamps. So the fps and 
setpts filters are necessary if the 2 inputs have different 
framerates/starting points.

The ffmpeg tool likely takes care of this for you.

> 
> 
> -Brian
> 
> 
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
> 

Cheers,

-- 
Philippe Gorley
Free Software Consultant | Montréal, Qc
Savoir-faire Linux


More information about the Libav-user mailing list