66
77import com .google .common .base .Strings ;
88import com .google .common .collect .ImmutableList ;
9+ import java .util .ArrayList ;
10+ import java .util .List ;
911import java .util .concurrent .TimeUnit ;
1012import javax .annotation .CheckReturnValue ;
1113
@@ -16,6 +18,11 @@ public class FFmpegHlsOutputBuilder extends AbstractFFmpegOutputBuilder<FFmpegHl
1618 public Long hls_init_time ;
1719 public Integer hls_list_size ;
1820 public String hls_base_url ;
21+ public String hls_playlist_type ;
22+ public String master_pl_name ;
23+ public String var_stream_map ;
24+
25+ private final List <HlsVariant > variants = new ArrayList <>();
1926
2027 protected FFmpegHlsOutputBuilder (FFmpegBuilder parent , String filename ) {
2128 super (parent , filename );
@@ -107,6 +114,52 @@ public FFmpegHlsOutputBuilder setHlsBaseUrl(String baseurl) {
107114 return this ;
108115 }
109116
117+ /**
118+ * Set the playlist type.
119+ *
120+ * @param type The playlist type (e.g. "event", "vod")
121+ * @return {@link FFmpegHlsOutputBuilder}
122+ */
123+ public FFmpegHlsOutputBuilder setHlsPlaylistType (String type ) {
124+ this .hls_playlist_type = checkNotEmpty (type , "type must not be empty" );
125+ return this ;
126+ }
127+
128+ /**
129+ * Set the master playlist name.
130+ *
131+ * @param name The master playlist name
132+ * @return {@link FFmpegHlsOutputBuilder}
133+ */
134+ public FFmpegHlsOutputBuilder setMasterPlName (String name ) {
135+ this .master_pl_name = checkNotEmpty (name , "name must not be empty" );
136+ return this ;
137+ }
138+
139+ /**
140+ * Set the variant stream map string manually.
141+ *
142+ * <p>Prefer using {@link #addVariant(HlsVariant)} for a cleaner API.
143+ *
144+ * @param map The variant stream map (e.g. "v:0,a:0 v:1,a:1")
145+ * @return {@link FFmpegHlsOutputBuilder}
146+ */
147+ public FFmpegHlsOutputBuilder setVarStreamMap (String map ) {
148+ this .var_stream_map = checkNotEmpty (map , "map must not be empty" );
149+ return this ;
150+ }
151+
152+ /**
153+ * Adds an HLS variant to this output.
154+ *
155+ * @param variant The variant configuration.
156+ * @return {@link FFmpegHlsOutputBuilder}
157+ */
158+ public FFmpegHlsOutputBuilder addVariant (HlsVariant variant ) {
159+ this .variants .add (checkNotNull (variant ));
160+ return this ;
161+ }
162+
110163 @ Override
111164 protected void addFormatArgs (ImmutableList .Builder <String > args ) {
112165 super .addFormatArgs (args );
@@ -129,6 +182,27 @@ protected void addFormatArgs(ImmutableList.Builder<String> args) {
129182 if (!Strings .isNullOrEmpty (hls_base_url )) {
130183 args .add ("-hls_base_url" , hls_base_url );
131184 }
185+
186+ if (!Strings .isNullOrEmpty (hls_playlist_type )) {
187+ args .add ("-hls_playlist_type" , hls_playlist_type );
188+ }
189+
190+ if (!Strings .isNullOrEmpty (master_pl_name )) {
191+ args .add ("-master_pl_name" , master_pl_name );
192+ }
193+
194+ if (!Strings .isNullOrEmpty (var_stream_map )) {
195+ args .add ("-var_stream_map" , var_stream_map );
196+ } else if (!variants .isEmpty ()) {
197+ StringBuilder sb = new StringBuilder ();
198+ for (int i = 0 ; i < variants .size (); i ++) {
199+ if (i > 0 ) {
200+ sb .append (" " );
201+ }
202+ sb .append (variants .get (i ).toString ());
203+ }
204+ args .add ("-var_stream_map" , sb .toString ());
205+ }
132206 }
133207
134208 @ CheckReturnValue
0 commit comments