[Libav-user] Overlay filter has incorrect frame rate

Brian C. Wiles brian at streamcomm.com
Fri Jul 27 18:24:05 EEST 2018



On 07/27/2018 10:10 AM, Philippe Gorley wrote:
> 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
>>
> Cheers,
>
  That's what I wondered.  So, if I specify the right fps and setpts
combinations, it should work fine?  I thought the overlay filter was
supposed to add and drop frames as needed.  Also, do I specify the frame
rate of the overlaid video or the bottom one?  Thanks!



More information about the Libav-user mailing list