[FFmpeg-devel] [PATCH] fftools/ffmpeg: fix -t inaccurate recording time

Shiwang.Xie shiwang.xie666 at outlook.com
Fri Jul 9 08:33:06 EEST 2021


Pings.

On Sat, 5 Jun 2021, Shiwang.Xie wrote:

> Ping.
>
> Thanks,
> Shiwang.Xie
>
> On Sat, 29 May 2021, Shiwang.Xie wrote:
>
>> Hi, any updates for this?
>> 
>> Thanks,
>> Shiwang.Xie
>> 
>> On Wed, 19 May 2021, Shiwang.Xie wrote:
>> 
>>> Hi, is there objection?
>>> 
>>> Thanks,
>>> Shiwang.Xie
>>> 
>>> On Sat, 15 May 2021, Shiwang.Xie wrote:
>>> 
>>>> if input start time is not 0 -t is inaccurate doing stream copy,
>>>> will record extra duration according to input start time.
>>>> it should base on following cases:
>>>> 
>>>> input video start time from 60s, duration is 300s,
>>>> 1. stream copy:
>>>>       ffmpeg -ss 40 -t 60 -i in.mp4 -c copy -y out.mp4
>>>>   open_input_file() will seek to 100 and set ts_offset to -100,
>>>>   process_input() will offset pkt->pts with ts_offset to make it 0,
>>>>   so when do_streamcopy() with -t, exits when ist->pts >= recording_time.
>>>> 
>>>> 2. stream copy with -copyts:
>>>>       ffmpeg -ss 40 -t 60 -copyts -i in.mp4 -c copy -y out.mp4
>>>>   open_input_file() will seek to 100 and set ts_offset to 0,
>>>>   process_input() will keep raw pkt->pts as ts_offset is 0,
>>>>   so when do_streamcopy() with -t, exits when
>>>>   ist->pts >= (recording_time+f->start_time+f->ctx->start_time).
>>>> 
>>>> 3. stream copy with -copyts -start_at_zero:
>>>>       ffmpeg -ss 40 -t 60 -copyts -start_at_zero -i in.mp4 -c copy -y 
>>>> out.mp4
>>>>   open_input_file() will seek to 120 and set ts_offset to -60 as 
>>>> start_to_zero option,
>>>>   process_input() will offset pkt->pts with input file start time,
>>>>   so when do_streamcopy() with -t, exits when ist->pts >= 
>>>> (recording_time+f->start_time).
>>>> 
>>>> 0      60     40      60                     360
>>>> |_______|_____|_______|_______________________|
>>>>      start   -ss     -t
>>>> 
>>>> This fixes ticket #9141.
>>>> 
>>>> Signed-off-by: Shiwang.Xie <shiwang.xie666 at outlook.com>
>>>> ---
>>>> fftools/ffmpeg.c | 8 +++++---
>>>> 1 file changed, 5 insertions(+), 3 deletions(-)
>>>> 
>>>> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
>>>> index b3658d8f65..309d9dfa6e 100644
>>>> --- a/fftools/ffmpeg.c
>>>> +++ b/fftools/ffmpeg.c
>>>> @@ -2082,9 +2082,11 @@ static void do_streamcopy(InputStream *ist, 
>>>> OutputStream *ost, const AVPacket *p
>>>>     }
>>>>
>>>>     if (f->recording_time != INT64_MAX) {
>>>> -        start_time = f->ctx->start_time;
>>>> -        if (f->start_time != AV_NOPTS_VALUE && copy_ts)
>>>> -            start_time += f->start_time;
>>>> +        start_time = 0;
>>>> +        if (copy_ts) {
>>>> +            start_time += f->start_time != AV_NOPTS_VALUE ? 
>>>> f->start_time : 0;
>>>> +            start_time += start_at_zero ? 0 : f->ctx->start_time;
>>>> +        }
>>>>         if (ist->pts >= f->recording_time + start_time) {
>>>>             close_output_stream(ost);
>>>>             return;
>>>> -- 
>>>> 2.18.5
>>>> 
>>>> 
>>> 
>> 
>


More information about the ffmpeg-devel mailing list