[Libav-user] HLS: Exactly constant segment duration

Andy Shaules bowljoman at gmail.com
Mon Aug 19 19:01:45 CEST 2013


On 8/19/2013 3:03 AM, Anshul wrote:
> On 08/19/2013 03:18 PM, Andrey Mochenov wrote:
>> Hi,
>> Thank you for your answer.
>> I suppose, IDR stands for Instantaneous Decoding Refresh.
>> Please, explain: what do you mean under "set encoder with all idr"?
>>
>> What settings I need to use?
>> Andrey.
>> On Mon, Aug 19, 2013 at 10:48 AM, Anshul maheshwari 
>> <er.anshul.maheshwari at gmail.com 
>> <mailto:er.anshul.maheshwari at gmail.com>> wrote:
>>
>>     Please dont top post over here
>>
>>     Try to set encoder with all idr,  that may give you const duration
>>
>>     On Aug 15, 2013 4:59 PM, "Andrey Mochenov" <andrey2067 at gmail.com
>>     <mailto:andrey2067 at gmail.com>> wrote:
>>     >
>>     > Hi,
>>     >
>>     > We are using FFmpeg libraries git-ee94362 libavformat v55.2.100.
>>     > Our purpose is to mux two streams (video and audio) into M3U8
>>     playlist using HLS.
>>     > In addition, we want the duration of every TS segment file be
>>     exactly 3.0 sec (frame rate is 25 fps).
>>     > To reach it, we are trying to set several options and
>>     properties, namely:
>>     > - segment_time
>>     > - keyint_min
>>     > - scenechange_threshold
>>     > - gop_size
>>     > - force_key_frames.
>>     >
>>     > And our code looks as below:
>>     >
>>     > AVCodecContext *codec_ctx = NULL;
>>     > AVFormatContext *ofmt_ctx = NULL;
>>     > int ret = 0, gopSize = (int)(3.0 * 25);   // 3 sec * 25 fps
>>     >
>>     > // ofmt_ctx and codec_ctx initialization and filling are OK, but:
>>     >
>>     > codec_ctx->time_base.num = 1;
>>     > codec_ctx->time_base.den = 25 // fps
>>     >
>>     > // It seems, that the following three lines have no effect
>>     without explisit setting of the "hls_time" property
>>     > codec_ctx->keyint_min = gopSize;       // in FFMpeg
>>     application, the corresponding option is "-keyint_min 3"
>>     > codec_ctx->scenechange_threshold = 0;  // in FFMpeg
>>     application, the corresponding option is "-sc_threshold 0"
>>     > codec_ctx->gop_size = gopSize;         // in FFMpeg
>>     application, the corresponding option is "-g 3"
>>     >
>>     > ret = av_opt_set_double(ofmt_ctx, "hls_time", 3.0,
>>     AV_OPT_SEARCH_CHILDREN);
>>     >
>>     > // Any of the following lines causes "Option not found" error.
>>     > ret = av_opt_set(codec_ctx->priv_data, "profile", "main",
>>     AV_OPT_SEARCH_CHILDREN);
>>     > ret = av_opt_set(codec_ctx->priv_data, "preset", "ultrafast",
>>     AV_OPT_SEARCH_CHILDREN);
>>     > ret = av_opt_get(ofmt_ctx, "segment_time",
>>     AV_OPT_SEARCH_CHILDREN, &str);
>>     > ret = av_opt_set((ofmt_ctx, "segment_time", "3.0",
>>     AV_OPT_SEARCH_CHILDREN);
>>     >
>>     > Anyway, the TS files durations are different, (~2-3 sec), and
>>     not EXACTLY 3.0 sec.
>>     > Our question: What is the best way to solve the problem?
>>     >
>>     > Andrey Mochenov.
>>     >
>>     >
>>
>>     > _______________________________________________
>>     > Libav-user mailing list
>>     > Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
>>     > http://ffmpeg.org/mailman/listinfo/libav-user
>>     >
>>
>>     Please dont top post over here
>>
>>     Try to set encoder with all idr,  that may give you const duration
>>
>>
>>     _______________________________________________
>>     Libav-user mailing list
>>     Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
>>     http://ffmpeg.org/mailman/listinfo/libav-user
>>
>>
>>
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
>
>
> *I am reminding you again, please don't top post on this mailing list.
>
> *While cutting the video , segmenter over ride the segement-time if at 
> that time  IDR is not the frame.
> so if you have less interval between idr, than there are probability 
> that segmenter does not over-ride the segment-time. just to verify 
> that you are facing the same problem set your encoder IDR interval as 
> 0 or 1,
>
> -Anshul
>
>
>
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user

It also can help to use a higher version in the m3u8 file list so that 
you can specify decimals for duration.If your segment is 200 mills short 
or longer, the client is able to anticipate gaps, and initiate the next 
stream-pull earlier or later. Seemed to me while segmenting live 
streams, that as long as I did the chop at interval of 4 or 8 seconds, 
that my segments could be shorter or longer and play-out is smooth as 
long as I was honest in the playlist about the actual duration of each 
entry.


Andy


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130819/4c8a56c6/attachment.html>


More information about the Libav-user mailing list