[FFmpeg-user] Fixed GOP encoding for HLS

Steven Liu lingjiujianke at gmail.com
Fri Dec 21 06:21:44 CET 2012

2012/12/19 Stefano Sabatini <stefasab at gmail.com>:
> On date Tuesday 2012-12-18 16:42:53 +1100, Andrew Sinclair wrote:
>> Looking at the proposed code change the +1 isn't necessary as according the
>> HLS spec the #EXT-X-TARGETDURATION only needs to be >= the segment
>> timeframe so as long as it is equal to it is OK.
>> I am also getting closer to the issue that I am seeing and it could be for
>> support for some older players as using a decimal/float as the duration is
>> only a reasonably recent addition to the spec as previously the #EXTINF
>> needed to be an int. I am going to play with some patches to the code I
>> have done for this and will report back.
>> However there is definitely some significant variaion in what segment.c is
>> generating as the #EXTINF durations and what ffprobe reports as the
>> duration. Can anyone point me in the direction of how segment.c calculates
>> the duration?
> max_pkt_end_time - start_time
> where max_pkt_end_time is the maximum of the values pts+duration for
> all packets in the segment.
> This can be improved, for example defining a reference stream and only
> considering the packets coming from that stream when computing the
> max_pkt_end_time.
> On the other hand ffprobe relies on header information and on the
> assumed bitrate for computing the duration, but the only reliable way
> to get a stream duration is to demux the stream and read the various
> timestamps.

And the code have told us,

 /* if the segment has video, start a new segment *only* with a key
video frame */
    if ((st->codec->codec_type == AVMEDIA_TYPE_VIDEO || !seg->has_video) &&
        pkt->pts != AV_NOPTS_VALUE &&
        av_compare_ts(pkt->pts, st->time_base,
                      end_pts-seg->time_delta, AV_TIME_BASE_Q) >= 0 &&
        pkt->flags & AV_PKT_FLAG_KEY)

the codetype equ AVMEDIA_TYPE_VIDEO or !seg->has_video  and the
packets pts is not NOPTS, and the message waht Stefano Sabatini said,
and the packets flag is AV_PKT_FLAG_KEY . the segment is end, if there
have more stream, the packets will start a new segment.

More information about the ffmpeg-user mailing list