[FFmpeg-devel] [PATCH] avformat/segment: fix the duration error of use output_ts_offset
Steven Liu
lingjiujianke at gmail.com
Fri Sep 9 14:59:19 EEST 2016
2016-09-09 16:33 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>
>
> 2016-09-09 16:10 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>
>>
>>
>> 2016-09-09 15:33 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>>
>>>
>>>
>>> 2016-09-09 15:28 GMT+08:00 Aman Gupta <aman at 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 at 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 at 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 at 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 at localhost linux]#
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> this commit is used for fix commit 1da00be009aa74400042bf470b9a5f
>>>>> fbd82a1c5e
>>>>> because the option initial_offset will deprecated
>>>>>
>>>>> Signed-off-by: Steven Liu <lingjiujianke at 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 at 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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avformat-segment-fix-the-duration-error-of-use-outpu.patch
Type: application/octet-stream
Size: 2542 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160909/dfaa7115/attachment.obj>
More information about the ffmpeg-devel
mailing list