diff --git a/ffmpeg.c b/ffmpeg.c index 7621e9d997..3eb15a6494 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -1340,6 +1340,10 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p !ost->copy_initial_nonkeyframes) return; + if (!ost->frame_number && ist->pts < of->start_time && + !ost->copy_prior_start) + return; + if (of->recording_time != INT64_MAX && ist->pts >= of->recording_time + of->start_time) { close_output_stream(ost); diff --git a/ffmpeg.h b/ffmpeg.h index 85a11a01d9..56f8dfc5f1 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -157,6 +157,8 @@ typedef struct OptionsContext { int nb_presets; SpecifierOpt *copy_initial_nonkeyframes; int nb_copy_initial_nonkeyframes; + SpecifierOpt *copy_prior_start; + int nb_copy_prior_start; SpecifierOpt *filters; int nb_filters; SpecifierOpt *fix_sub_duration; @@ -326,6 +328,7 @@ typedef struct OutputStream { int stream_copy; const char *attachment_filename; int copy_initial_nonkeyframes; + int copy_prior_start; int keep_pix_fmt; } OutputStream; diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 3d73564aa2..2c5fbfb6b2 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -960,6 +960,9 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->max_frames = INT64_MAX; MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st); + ost->copy_prior_start = -1; + MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st); + MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st); while (bsf) { if (next = strchr(bsf, ',')) @@ -2316,6 +2319,8 @@ const OptionDef options[] = { "exit on error", "error" }, { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_initial_nonkeyframes) }, "copy initial non-keyframes" }, + { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_prior_start) }, + "copy or discard frames before start time" }, { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, { .off = OFFSET(max_frames) }, "set the number of frames to record", "number" }, { "tag", OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },