[FFmpeg-devel] [PATCH] fftools/ffmpeg: fix -t inaccurate recording time
Shiwang.Xie
shiwang.xie666 at outlook.com
Sat Jun 5 14:18:13 EEST 2021
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