diff mbox

[FFmpeg-devel] avformat/segment: fix the duration error of use output_ts_offset

Message ID CADxeRwmGoEFsJ7jMr_EQhYdokNH9vNR9dx469o6yzznHE48eBQ@mail.gmail.com
State Superseded
Headers show

Commit Message

Steven Liu Sept. 9, 2016, 11:59 a.m. UTC
2016-09-09 16:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:

>
>
> 2016-09-09 16:10 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>
>>
>>
>> 2016-09-09 15:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>
>>>
>>>
>>> 2016-09-09 15:28 GMT+08:00 Aman Gupta <aman@tmm1.net>:
>>>
>>>> I tried your patch and TARGETDURATION is fixed, but it is still
>>>> creating some segments which are only 0.2s instead of 2s.
>>>>
>>>> Aman
>>>>
>>>> On Thu, Sep 8, 2016 at 8:14 PM, Steven Liu <lingjiujianke@gmail.com>
>>>> wrote:
>>>>
>>>>> This patch can merge with 1da00be009aa74400042bf470b9a5ffbd82a1c5e
>>>>> i have checked this modify:
>>>>>
>>>>> ./ffmpeg -i ~/facebook.mp4 -c copy -f segment -segment_time 2
>>>>> -output_ts_offset 80 -segment_list output-test.m3u8 -v debug
>>>>> output-test-%03d.ts
>>>>>
>>>>> #EXTM3U
>>>>> #EXT-X-VERSION:3
>>>>> #EXT-X-MEDIA-SEQUENCE:0
>>>>> #EXT-X-ALLOW-CACHE:YES
>>>>> #EXT-X-TARGETDURATION:10
>>>>> #EXTINF:4.120000,
>>>>> output-test-000.ts
>>>>> #EXTINF:7.840000,
>>>>> output-test-001.ts
>>>>> #EXTINF:4.200000,
>>>>> output-test-002.ts
>>>>> #EXTINF:2.920000,
>>>>> output-test-003.ts
>>>>> #EXTINF:1.840000,
>>>>> output-test-004.ts
>>>>> #EXTINF:2.240000,
>>>>> output-test-005.ts
>>>>> #EXTINF:2.000000,
>>>>> output-test-006.ts
>>>>> #EXTINF:3.560000,
>>>>>
>>>>>
>>>>> [root@localhost linux]# ffmpeg -i output-test.m3u8
>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>> developers
>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>> Input #0, hls,applehttp, from 'output-test.m3u8':
>>>>>   Duration: 00:03:21.04, start: 81.400000, bitrate: 0 kb/s
>>>>>   Program 0
>>>>>     Metadata:
>>>>>       variant_bitrate : 0
>>>>>     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p,
>>>>> 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>     Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz,
>>>>> 5.1(side), fltp, 384 kb/s
>>>>> At least one output file must be specified
>>>>>
>>>>>
>>>>>
>>>>> [root@localhost linux]# ffmpeg -i output-test-000.ts -i
>>>>> output-test-001.ts
>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>> developers
>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>> Input #0, mpegts, from 'output-test-000.ts':
>>>>>   Duration: 00:00:04.12, start: 81.400000, bitrate: 1299 kb/s
>>>>>   Program 1
>>>>>     Metadata:
>>>>>       service_name    : Service01
>>>>>       service_provider: FFmpeg
>>>>>     Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>     Stream #0:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>> Input #1, mpegts, from 'output-test-001.ts':
>>>>>   Duration: 00:00:07.90, start: 85.464000, bitrate: 1679 kb/s
>>>>>   Program 1
>>>>>     Metadata:
>>>>>       service_name    : Service01
>>>>>       service_provider: FFmpeg
>>>>>     Stream #1:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>     Stream #1:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>> At least one output file must be specified
>>>>> [root@localhost linux]#
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f
>>>>> fbd82a1c5e
>>>>> because the option initial_offset will deprecated
>>>>>
>>>>> Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
>>>>> ---
>>>>>  libavformat/segment.c |    5 +++++
>>>>>  1 files changed, 5 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>>>>> index 33a5cf0..252f8b1 100644
>>>>> --- a/libavformat/segment.c
>>>>> +++ b/libavformat/segment.c
>>>>> @@ -885,6 +885,11 @@ calc_times:
>>>>>          av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
>>>>> stream:%d pts:%s pts_time:%s frame:%d\n",
>>>>>                 seg->avf->filename, pkt->stream_index,
>>>>>                 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
>>>>> &st->time_base), seg->frame_count);
>>>>> +        seg->cut_pending = 0;
>>>>> +        seg->cur_entry.index = seg->segment_idx +
>>>>> seg->segment_idx_wrap * seg->segment_idx_wrap_nb;
>>>>> +        seg->cur_entry.start_time = (double)pkt->pts *
>>>>> av_q2d(st->time_base);
>>>>> +        seg->cur_entry.start_pts = av_rescale_q(pkt->pts,
>>>>> st->time_base, AV_TIME_BASE_Q);
>>>>> +        seg->cur_entry.end_time = seg->cur_entry.start_time;
>>>>>      }
>>>>>
>>>>>      av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
>>>>> pts_time:%s dts:%s dts_time:%s",
>>>>> --
>>>>> 1.7.1
>>>>>
>>>>
>>>> ok, let me try your command line
>>>
>>>
>> ......
>> it's reproduced when encode by default(video:mpeg2video  audio: mp2)
>>
>> Ha, interesting,
> /ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -g 50 -f segment
>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>
> no problem
>
> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v mpeg2video -g 50 -f
> segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>
> no problem
>
> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v libx264 -g 50 -f
> segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>
> no problem
>
>
> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c copy -f segment
>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>
> no problem
>
>
> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -f segment  -segment_time
> 2 -segment_start_number 10 -output_ts_offset 40 -segment_list
> output-test.m3u8 -v debug output-test-%03d.ts
>
> reproduced
>
>
>
patch update, no problem now.

./ffmpeg -ss 40 -i ~/Movies/objectC/facebook.mp4 -f segment  -segment_time
2 -output_ts_offset 40 -segment_list output-test.m3u8 -segment_start_number
10 -t 12 output-test-%03d.ts

no problem

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:10
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:3
#EXTINF:2.400000,
output-test-010.ts
#EXTINF:2.040000,
output-test-011.ts
#EXTINF:1.920000,
output-test-012.ts
#EXTINF:1.920000,
output-test-013.ts
#EXTINF:1.920000,
output-test-014.ts
#EXTINF:1.800000,
output-test-015.ts
#EXT-X-ENDLIST



this commit is used for fix commit 1da00be009aa74400042bf470b9a5ffbd82a1c5e
because the option initial_offset will deprecated

Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
---
 libavformat/segment.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

     }

@@ -885,6 +891,10 @@ calc_times:
         av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
stream:%d pts:%s pts_time:%s frame:%d\n",
                seg->avf->filename, pkt->stream_index,
                av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
&st->time_base), seg->frame_count);
+        seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap *
seg->segment_idx_wrap_nb;
+        seg->cur_entry.start_time = (double)pkt->pts *
av_q2d(st->time_base);
+        seg->cur_entry.start_pts = av_rescale_q(pkt->pts, st->time_base,
AV_TIME_BASE_Q);
+        seg->cur_entry.end_time = seg->cur_entry.start_time;
     }

     av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
pts_time:%s dts:%s dts_time:%s",
--
2.7.4 (Apple Git-66)

Comments

Steven Liu Sept. 9, 2016, 10 p.m. UTC | #1
Steven Liu <lingjiujianke@gmail.com>于2016年9月9日 周五下午7:59写道:

> 2016-09-09 16:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>
>>
>>
>> 2016-09-09 16:10 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>
>>>
>>>
>>> 2016-09-09 15:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>>
>>>>
>>>>
>>>> 2016-09-09 15:28 GMT+08:00 Aman Gupta <aman@tmm1.net>:
>>>>
>>>>> I tried your patch and TARGETDURATION is fixed, but it is still
>>>>> creating some segments which are only 0.2s instead of 2s.
>>>>>
>>>>> Aman
>>>>>
>>>>> On Thu, Sep 8, 2016 at 8:14 PM, Steven Liu <lingjiujianke@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> This patch can merge with 1da00be009aa74400042bf470b9a5ffbd82a1c5e
>>>>>> i have checked this modify:
>>>>>>
>>>>>> ./ffmpeg -i ~/facebook.mp4 -c copy -f segment -segment_time 2
>>>>>> -output_ts_offset 80 -segment_list output-test.m3u8 -v debug
>>>>>> output-test-%03d.ts
>>>>>>
>>>>>> #EXTM3U
>>>>>> #EXT-X-VERSION:3
>>>>>> #EXT-X-MEDIA-SEQUENCE:0
>>>>>> #EXT-X-ALLOW-CACHE:YES
>>>>>> #EXT-X-TARGETDURATION:10
>>>>>> #EXTINF:4.120000,
>>>>>> output-test-000.ts
>>>>>> #EXTINF:7.840000,
>>>>>> output-test-001.ts
>>>>>> #EXTINF:4.200000,
>>>>>> output-test-002.ts
>>>>>> #EXTINF:2.920000,
>>>>>> output-test-003.ts
>>>>>> #EXTINF:1.840000,
>>>>>> output-test-004.ts
>>>>>> #EXTINF:2.240000,
>>>>>> output-test-005.ts
>>>>>> #EXTINF:2.000000,
>>>>>> output-test-006.ts
>>>>>> #EXTINF:3.560000,
>>>>>>
>>>>>>
>>>>>> [root@localhost linux]# ffmpeg -i output-test.m3u8
>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>>> developers
>>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>>> Input #0, hls,applehttp, from 'output-test.m3u8':
>>>>>>   Duration: 00:03:21.04, start: 81.400000, bitrate: 0 kb/s
>>>>>>   Program 0
>>>>>>     Metadata:
>>>>>>       variant_bitrate : 0
>>>>>>     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>     Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz,
>>>>>> 5.1(side), fltp, 384 kb/s
>>>>>> At least one output file must be specified
>>>>>>
>>>>>>
>>>>>>
>>>>>> [root@localhost linux]# ffmpeg -i output-test-000.ts -i
>>>>>> output-test-001.ts
>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>>> developers
>>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>>> Input #0, mpegts, from 'output-test-000.ts':
>>>>>>   Duration: 00:00:04.12, start: 81.400000, bitrate: 1299 kb/s
>>>>>>   Program 1
>>>>>>     Metadata:
>>>>>>       service_name    : Service01
>>>>>>       service_provider: FFmpeg
>>>>>>     Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>     Stream #0:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>>> Input #1, mpegts, from 'output-test-001.ts':
>>>>>>   Duration: 00:00:07.90, start: 85.464000, bitrate: 1679 kb/s
>>>>>>   Program 1
>>>>>>     Metadata:
>>>>>>       service_name    : Service01
>>>>>>       service_provider: FFmpeg
>>>>>>     Stream #1:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>     Stream #1:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>>> At least one output file must be specified
>>>>>> [root@localhost linux]#
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> this commit is used for fix commit
>>>>>> 1da00be009aa74400042bf470b9a5ffbd82a1c5e
>>>>>> because the option initial_offset will deprecated
>>>>>>
>>>>>> Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
>>>>>> ---
>>>>>>  libavformat/segment.c |    5 +++++
>>>>>>  1 files changed, 5 insertions(+), 0 deletions(-)
>>>>>>
>>>>>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>>>>>> index 33a5cf0..252f8b1 100644
>>>>>> --- a/libavformat/segment.c
>>>>>> +++ b/libavformat/segment.c
>>>>>> @@ -885,6 +885,11 @@ calc_times:
>>>>>>          av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
>>>>>> stream:%d pts:%s pts_time:%s frame:%d\n",
>>>>>>                 seg->avf->filename, pkt->stream_index,
>>>>>>                 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
>>>>>> &st->time_base), seg->frame_count);
>>>>>> +        seg->cut_pending = 0;
>>>>>> +        seg->cur_entry.index = seg->segment_idx +
>>>>>> seg->segment_idx_wrap * seg->segment_idx_wrap_nb;
>>>>>> +        seg->cur_entry.start_time = (double)pkt->pts *
>>>>>> av_q2d(st->time_base);
>>>>>> +        seg->cur_entry.start_pts = av_rescale_q(pkt->pts,
>>>>>> st->time_base, AV_TIME_BASE_Q);
>>>>>> +        seg->cur_entry.end_time = seg->cur_entry.start_time;
>>>>>>      }
>>>>>>
>>>>>>      av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
>>>>>> pts_time:%s dts:%s dts_time:%s",
>>>>>> --
>>>>>> 1.7.1
>>>>>>
>>>>>
>>>>> ok, let me try your command line
>>>>
>>>>
>>> ......
>>> it's reproduced when encode by default(video:mpeg2video  audio: mp2)
>>>
>>> Ha, interesting,
>> /ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -g 50 -f segment
>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>
>> no problem
>>
>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v mpeg2video -g 50 -f
>> segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>
>> no problem
>>
>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v libx264 -g 50 -f
>> segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>
>> no problem
>>
>>
>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c copy -f segment
>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>
>> no problem
>>
>>
>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -f segment
>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>
>> reproduced
>>
>>
>>
> patch update, no problem now.
>
> ./ffmpeg -ss 40 -i ~/Movies/objectC/facebook.mp4 -f segment  -segment_time
> 2 -output_ts_offset 40 -segment_list output-test.m3u8 -segment_start_number
> 10 -t 12 output-test-%03d.ts
>
> no problem
>
> #EXTM3U
> #EXT-X-VERSION:3
> #EXT-X-MEDIA-SEQUENCE:10
> #EXT-X-ALLOW-CACHE:YES
> #EXT-X-TARGETDURATION:3
> #EXTINF:2.400000,
> output-test-010.ts
> #EXTINF:2.040000,
> output-test-011.ts
> #EXTINF:1.920000,
> output-test-012.ts
> #EXTINF:1.920000,
> output-test-013.ts
> #EXTINF:1.920000,
> output-test-014.ts
> #EXTINF:1.800000,
> output-test-015.ts
> #EXT-X-ENDLIST
>
>
>
> this commit is used for fix commit 1da00be009aa74400042bf470b9a5ffbd82a1c5e
> because the option initial_offset will deprecated
>
> Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
> ---
>  libavformat/segment.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/segment.c b/libavformat/segment.c
> index 33a5cf0..74ffe03 100644
> --- a/libavformat/segment.c
> +++ b/libavformat/segment.c
> @@ -101,6 +101,7 @@ typedef struct SegmentContext {
>      char *times_str;       ///< segment times specification string
>      int64_t *times;        ///< list of segment interval specification
>      int nb_times;          ///< number of elments in the times array
> +    int64_t init_time;     ///< first segment start time
>
>      char *frames_str;      ///< segment frame numbers specification string
>      int *frames;           ///< list of frame number specification
> @@ -642,6 +643,7 @@ static int seg_init(AVFormatContext *s)
>      int ret;
>      int i;
>
> +    seg->init_time = 0;
>      seg->segment_count = 0;
>      if (!seg->write_header_trailer)
>          seg->individual_header_trailer = 0;
> @@ -837,7 +839,11 @@ calc_times:
>              }
>              seg->last_val = wrapped_val;
>          } else {
> -            end_pts = seg->time * (seg->segment_count + 1);
> +            if (seg->init_time == 0) {
> +                seg->init_time = av_rescale_q(pkt->pts, st->time_base,
> AV_TIME_BASE_Q);
> +            } else {
> +                end_pts = seg->time * (seg->segment_count + 1) +
> seg->init_time;
> +            }
>          }
>      }
>
> @@ -885,6 +891,10 @@ calc_times:
>          av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
> stream:%d pts:%s pts_time:%s frame:%d\n",
>                 seg->avf->filename, pkt->stream_index,
>                 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
> &st->time_base), seg->frame_count);
> +        seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap *
> seg->segment_idx_wrap_nb;
> +        seg->cur_entry.start_time = (double)pkt->pts *
> av_q2d(st->time_base);
> +        seg->cur_entry.start_pts = av_rescale_q(pkt->pts, st->time_base,
> AV_TIME_BASE_Q);
> +        seg->cur_entry.end_time = seg->cur_entry.start_time;
>      }
>
>      av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
> pts_time:%s dts:%s dts_time:%s",
> --
> 2.7.4 (Apple Git-66)
>
> maybe have a bug, I'll fix it
When use all the output_ts_offset and initial_offset it will wrong result.
Aman Karmani Sept. 10, 2016, 5:55 a.m. UTC | #2
I confirmed your latest patch fixes the issue and is working as expected
now.

Thank you!

Aman

On Sat, Sep 10, 2016 at 7:00 AM, Steven Liu <lingjiujianke@gmail.com> wrote:

>
> Steven Liu <lingjiujianke@gmail.com>于2016年9月9日 周五下午7:59写道:
>
>> 2016-09-09 16:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>
>>>
>>>
>>> 2016-09-09 16:10 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>>
>>>>
>>>>
>>>> 2016-09-09 15:33 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>>>>
>>>>>
>>>>>
>>>>> 2016-09-09 15:28 GMT+08:00 Aman Gupta <aman@tmm1.net>:
>>>>>
>>>>>> I tried your patch and TARGETDURATION is fixed, but it is still
>>>>>> creating some segments which are only 0.2s instead of 2s.
>>>>>>
>>>>>> Aman
>>>>>>
>>>>>> On Thu, Sep 8, 2016 at 8:14 PM, Steven Liu <lingjiujianke@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> This patch can merge with 1da00be009aa74400042bf470b9a5ffbd82a1c5e
>>>>>>> i have checked this modify:
>>>>>>>
>>>>>>> ./ffmpeg -i ~/facebook.mp4 -c copy -f segment -segment_time 2
>>>>>>> -output_ts_offset 80 -segment_list output-test.m3u8 -v debug
>>>>>>> output-test-%03d.ts
>>>>>>>
>>>>>>> #EXTM3U
>>>>>>> #EXT-X-VERSION:3
>>>>>>> #EXT-X-MEDIA-SEQUENCE:0
>>>>>>> #EXT-X-ALLOW-CACHE:YES
>>>>>>> #EXT-X-TARGETDURATION:10
>>>>>>> #EXTINF:4.120000,
>>>>>>> output-test-000.ts
>>>>>>> #EXTINF:7.840000,
>>>>>>> output-test-001.ts
>>>>>>> #EXTINF:4.200000,
>>>>>>> output-test-002.ts
>>>>>>> #EXTINF:2.920000,
>>>>>>> output-test-003.ts
>>>>>>> #EXTINF:1.840000,
>>>>>>> output-test-004.ts
>>>>>>> #EXTINF:2.240000,
>>>>>>> output-test-005.ts
>>>>>>> #EXTINF:2.000000,
>>>>>>> output-test-006.ts
>>>>>>> #EXTINF:3.560000,
>>>>>>>
>>>>>>>
>>>>>>> [root@localhost linux]# ffmpeg -i output-test.m3u8
>>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>>>> developers
>>>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>>>> Input #0, hls,applehttp, from 'output-test.m3u8':
>>>>>>>   Duration: 00:03:21.04, start: 81.400000, bitrate: 0 kb/s
>>>>>>>   Program 0
>>>>>>>     Metadata:
>>>>>>>       variant_bitrate : 0
>>>>>>>     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>>     Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz,
>>>>>>> 5.1(side), fltp, 384 kb/s
>>>>>>> At least one output file must be specified
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> [root@localhost linux]# ffmpeg -i output-test-000.ts -i
>>>>>>> output-test-001.ts
>>>>>>> ffmpeg version N-80917-ga1a240b Copyright (c) 2000-2016 the FFmpeg
>>>>>>> developers
>>>>>>>   built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-17)
>>>>>>>   configuration: --prefix=/usr/ --libdir=/usr/lib64 --enable-libx264
>>>>>>> --enable-libfaac --enable-gpl --enable-nonfree
>>>>>>>   libavutil      55. 28.100 / 55. 28.100
>>>>>>>   libavcodec     57. 48.102 / 57. 48.102
>>>>>>>   libavformat    57. 41.100 / 57. 41.100
>>>>>>>   libavdevice    57.  0.102 / 57.  0.102
>>>>>>>   libavfilter     6. 47.100 /  6. 47.100
>>>>>>>   libswscale      4.  1.100 /  4.  1.100
>>>>>>>   libswresample   2.  1.100 /  2.  1.100
>>>>>>>   libpostproc    54.  0.100 / 54.  0.100
>>>>>>> Input #0, mpegts, from 'output-test-000.ts':
>>>>>>>   Duration: 00:00:04.12, start: 81.400000, bitrate: 1299 kb/s
>>>>>>>   Program 1
>>>>>>>     Metadata:
>>>>>>>       service_name    : Service01
>>>>>>>       service_provider: FFmpeg
>>>>>>>     Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>>     Stream #0:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>>>> Input #1, mpegts, from 'output-test-001.ts':
>>>>>>>   Duration: 00:00:07.90, start: 85.464000, bitrate: 1679 kb/s
>>>>>>>   Program 1
>>>>>>>     Metadata:
>>>>>>>       service_name    : Service01
>>>>>>>       service_provider: FFmpeg
>>>>>>>     Stream #1:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
>>>>>>> yuv420p, 720x528 [SAR 1:1 DAR 15:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
>>>>>>>     Stream #1:1[0x101](und): Audio: ac3 ([129][0][0][0] / 0x0081),
>>>>>>> 48000 Hz, 5.1(side), fltp, 384 kb/s
>>>>>>> At least one output file must be specified
>>>>>>> [root@localhost linux]#
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f
>>>>>>> fbd82a1c5e
>>>>>>> because the option initial_offset will deprecated
>>>>>>>
>>>>>>> Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
>>>>>>> ---
>>>>>>>  libavformat/segment.c |    5 +++++
>>>>>>>  1 files changed, 5 insertions(+), 0 deletions(-)
>>>>>>>
>>>>>>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>>>>>>> index 33a5cf0..252f8b1 100644
>>>>>>> --- a/libavformat/segment.c
>>>>>>> +++ b/libavformat/segment.c
>>>>>>> @@ -885,6 +885,11 @@ calc_times:
>>>>>>>          av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
>>>>>>> stream:%d pts:%s pts_time:%s frame:%d\n",
>>>>>>>                 seg->avf->filename, pkt->stream_index,
>>>>>>>                 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
>>>>>>> &st->time_base), seg->frame_count);
>>>>>>> +        seg->cut_pending = 0;
>>>>>>> +        seg->cur_entry.index = seg->segment_idx +
>>>>>>> seg->segment_idx_wrap * seg->segment_idx_wrap_nb;
>>>>>>> +        seg->cur_entry.start_time = (double)pkt->pts *
>>>>>>> av_q2d(st->time_base);
>>>>>>> +        seg->cur_entry.start_pts = av_rescale_q(pkt->pts,
>>>>>>> st->time_base, AV_TIME_BASE_Q);
>>>>>>> +        seg->cur_entry.end_time = seg->cur_entry.start_time;
>>>>>>>      }
>>>>>>>
>>>>>>>      av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
>>>>>>> pts_time:%s dts:%s dts_time:%s",
>>>>>>> --
>>>>>>> 1.7.1
>>>>>>>
>>>>>>
>>>>>> ok, let me try your command line
>>>>>
>>>>>
>>>> ......
>>>> it's reproduced when encode by default(video:mpeg2video  audio: mp2)
>>>>
>>>> Ha, interesting,
>>> /ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -g 50 -f segment
>>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>>
>>> no problem
>>>
>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v mpeg2video -g 50
>>> -f segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>>
>>> no problem
>>>
>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c:v libx264 -g 50 -f
>>> segment  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>>
>>> no problem
>>>
>>>
>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -c copy -f segment
>>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>>
>>> no problem
>>>
>>>
>>> ./ffmpeg -ss 20 -i ~/Movies/objectC/facebook.mp4 -f segment
>>>  -segment_time 2 -segment_start_number 10 -output_ts_offset 40
>>> -segment_list output-test.m3u8 -v debug output-test-%03d.ts
>>>
>>> reproduced
>>>
>>>
>>>
>> patch update, no problem now.
>>
>> ./ffmpeg -ss 40 -i ~/Movies/objectC/facebook.mp4 -f segment
>>  -segment_time 2 -output_ts_offset 40 -segment_list output-test.m3u8
>> -segment_start_number 10 -t 12 output-test-%03d.ts
>>
>> no problem
>>
>> #EXTM3U
>> #EXT-X-VERSION:3
>> #EXT-X-MEDIA-SEQUENCE:10
>> #EXT-X-ALLOW-CACHE:YES
>> #EXT-X-TARGETDURATION:3
>> #EXTINF:2.400000,
>> output-test-010.ts
>> #EXTINF:2.040000,
>> output-test-011.ts
>> #EXTINF:1.920000,
>> output-test-012.ts
>> #EXTINF:1.920000,
>> output-test-013.ts
>> #EXTINF:1.920000,
>> output-test-014.ts
>> #EXTINF:1.800000,
>> output-test-015.ts
>> #EXT-X-ENDLIST
>>
>>
>>
>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f
>> fbd82a1c5e
>> because the option initial_offset will deprecated
>>
>> Signed-off-by: Steven Liu <lingjiujianke@gmail.com>
>> ---
>>  libavformat/segment.c | 12 +++++++++++-
>>  1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>> index 33a5cf0..74ffe03 100644
>> --- a/libavformat/segment.c
>> +++ b/libavformat/segment.c
>> @@ -101,6 +101,7 @@ typedef struct SegmentContext {
>>      char *times_str;       ///< segment times specification string
>>      int64_t *times;        ///< list of segment interval specification
>>      int nb_times;          ///< number of elments in the times array
>> +    int64_t init_time;     ///< first segment start time
>>
>>      char *frames_str;      ///< segment frame numbers specification
>> string
>>      int *frames;           ///< list of frame number specification
>> @@ -642,6 +643,7 @@ static int seg_init(AVFormatContext *s)
>>      int ret;
>>      int i;
>>
>> +    seg->init_time = 0;
>>      seg->segment_count = 0;
>>      if (!seg->write_header_trailer)
>>          seg->individual_header_trailer = 0;
>> @@ -837,7 +839,11 @@ calc_times:
>>              }
>>              seg->last_val = wrapped_val;
>>          } else {
>> -            end_pts = seg->time * (seg->segment_count + 1);
>> +            if (seg->init_time == 0) {
>> +                seg->init_time = av_rescale_q(pkt->pts, st->time_base,
>> AV_TIME_BASE_Q);
>> +            } else {
>> +                end_pts = seg->time * (seg->segment_count + 1) +
>> seg->init_time;
>> +            }
>>          }
>>      }
>>
>> @@ -885,6 +891,10 @@ calc_times:
>>          av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet
>> stream:%d pts:%s pts_time:%s frame:%d\n",
>>                 seg->avf->filename, pkt->stream_index,
>>                 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts,
>> &st->time_base), seg->frame_count);
>> +        seg->cur_entry.index = seg->segment_idx + seg->segment_idx_wrap
>> * seg->segment_idx_wrap_nb;
>> +        seg->cur_entry.start_time = (double)pkt->pts *
>> av_q2d(st->time_base);
>> +        seg->cur_entry.start_pts = av_rescale_q(pkt->pts, st->time_base,
>> AV_TIME_BASE_Q);
>> +        seg->cur_entry.end_time = seg->cur_entry.start_time;
>>      }
>>
>>      av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s
>> pts_time:%s dts:%s dts_time:%s",
>> --
>> 2.7.4 (Apple Git-66)
>>
>> maybe have a bug, I'll fix it
> When use all the output_ts_offset and initial_offset it will wrong result.
>
diff mbox

Patch

diff --git a/libavformat/segment.c b/libavformat/segment.c
index 33a5cf0..74ffe03 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -101,6 +101,7 @@  typedef struct SegmentContext {
     char *times_str;       ///< segment times specification string
     int64_t *times;        ///< list of segment interval specification
     int nb_times;          ///< number of elments in the times array
+    int64_t init_time;     ///< first segment start time

     char *frames_str;      ///< segment frame numbers specification string
     int *frames;           ///< list of frame number specification
@@ -642,6 +643,7 @@  static int seg_init(AVFormatContext *s)
     int ret;
     int i;

+    seg->init_time = 0;
     seg->segment_count = 0;
     if (!seg->write_header_trailer)
         seg->individual_header_trailer = 0;
@@ -837,7 +839,11 @@  calc_times:
             }
             seg->last_val = wrapped_val;
         } else {
-            end_pts = seg->time * (seg->segment_count + 1);
+            if (seg->init_time == 0) {
+                seg->init_time = av_rescale_q(pkt->pts, st->time_base,
AV_TIME_BASE_Q);
+            } else {
+                end_pts = seg->time * (seg->segment_count + 1) +
seg->init_time;
+            }
         }