[FFmpeg-cvslog] add split_by_time flag for support splite mpegts segment at non-keyframe

Steven Liu git at videolan.org
Mon Jul 11 12:57:02 CEST 2016


ffmpeg | branch: master | Steven Liu <lingjiujianke at gmail.com> | Thu Jul  7 06:51:20 2016 +0800| [b45a976ed4d43ab9edc5b846802ee6f973d75a1b] | committer: Michael Niedermayer

add split_by_time flag for support splite mpegts segment at non-keyframe

support split hls segment at duration set by hls_time

Signed-off-by: LiuQi <liuqi at gosun.com>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b45a976ed4d43ab9edc5b846802ee6f973d75a1b
---

 doc/muxers.texi      |    6 ++++++
 libavformat/hlsenc.c |    4 +++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/doc/muxers.texi b/doc/muxers.texi
index c2ca0ba..d416c42 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -495,6 +495,12 @@ Will produce the playlist, @file{out.m3u8}, and a single segment file,
 Segment files removed from the playlist are deleted after a period of time
 equal to the duration of the segment plus the duration of the playlist.
 
+ at item hls_flags split_by_time
+If this flags is set, allow segments to start on frames other than keyframes.
+Thisimproves behavior on some players when the time between keyframes is
+inconsistent, but may make things worse on others, and can cause some oddities
+during seeking. This flag should be used with hls_time option.
+
 @item hls_playlist_type event
 Emit @code{#EXT-X-PLAYLIST-TYPE:EVENT} in the m3u8 header. Forces
 @option{hls_list_size} to 0; the playlist can only be appended to.
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index a9fa5d8..5dc518d 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -62,6 +62,7 @@ typedef enum HLSFlags {
     HLS_ROUND_DURATIONS = (1 << 2),
     HLS_DISCONT_START = (1 << 3),
     HLS_OMIT_ENDLIST = (1 << 4),
+    HLS_SPLIT_BY_TIME = (1 << 5),
 } HLSFlags;
 
 typedef enum {
@@ -813,7 +814,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
 
     if (hls->has_video) {
         can_split = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
-                    pkt->flags & AV_PKT_FLAG_KEY;
+                    ((pkt->flags & AV_PKT_FLAG_KEY) || (hls->flags & HLS_SPLIT_BY_TIME));
         is_ref_pkt = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO;
     }
     if (pkt->pts == AV_NOPTS_VALUE)
@@ -923,6 +924,7 @@ static const AVOption options[] = {
     {"round_durations", "round durations in m3u8 to whole numbers", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_ROUND_DURATIONS }, 0, UINT_MAX,   E, "flags"},
     {"discont_start", "start the playlist with a discontinuity tag", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DISCONT_START }, 0, UINT_MAX,   E, "flags"},
     {"omit_endlist", "Do not append an endlist when ending stream", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_OMIT_ENDLIST }, 0, UINT_MAX,   E, "flags"},
+    {"split_by_time", "split the hls segment by time which user set by hls_time", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SPLIT_BY_TIME }, 0, UINT_MAX,   E, "flags"},
     {"use_localtime", "set filename expansion with strftime at segment creation", OFFSET(use_localtime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
     {"use_localtime_mkdir", "create last directory component in strftime-generated filename", OFFSET(use_localtime_mkdir), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
     {"hls_playlist_type", "set the HLS playlist type", OFFSET(pl_type), AV_OPT_TYPE_INT, {.i64 = PLAYLIST_TYPE_NONE }, 0, PLAYLIST_TYPE_NB-1, E, "pl_type" },



More information about the ffmpeg-cvslog mailing list