[FFmpeg-cvslog] fftools/ffmpeg: fix -t inaccurate recording time
Shiwang.Xie
git at videolan.org
Sun Jul 18 07:30:57 EEST 2021
ffmpeg | branch: master | Shiwang.Xie <shiwang.xie666 at outlook.com> | Sat May 15 08:53:56 2021 +0000| [694545b6d5fff5a8242b5fab8c1746e74a06f9ba] | committer: Gyan Doshi
fftools/ffmpeg: fix -t inaccurate recording time
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>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=694545b6d5fff5a8242b5fab8c1746e74a06f9ba
---
fftools/ffmpeg.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index e0f2fe138f..3ca93fc8fa 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -2088,9 +2088,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;
More information about the ffmpeg-cvslog
mailing list