1313
1414use Streaming \FileManager ;
1515use Streaming \HLS ;
16- use Streaming \Representation ;
1716use Streaming \Utilities ;
1817
1918class HLSFilter extends Filter
@@ -34,11 +33,58 @@ public function setFilter($media): void
3433 private function HLSFilter (HLS $ hls )
3534 {
3635 $ filter = [];
37- $ total_count = count ($ representations = $ hls ->getRepresentations ());
38- $ counter = 0 ;
36+ $ representations = $ hls ->getRepresentations ();
3937 $ path_parts = $ hls ->getPathInfo ();
4038 $ dirname = str_replace ("\\" , "/ " , $ path_parts ["dirname " ]);
41- $ filename = substr ($ path_parts ["filename " ], -100 );
39+ list ($ ts_sub_dir , $ base_url ) = $ this ->getSubDirectory ($ hls , $ dirname );
40+
41+ foreach ($ representations as $ key => $ representation ) {
42+ if ($ key ) {
43+ $ filter = array_merge ($ filter , $ this ->getFormats ($ hls ));
44+ }
45+
46+ $ filter [] = "-s:v " ;
47+ $ filter [] = $ representation ->getResize ();
48+ $ filter [] = "-crf " ;
49+ $ filter [] = "20 " ;
50+ $ filter [] = "-sc_threshold " ;
51+ $ filter [] = "0 " ;
52+ $ filter [] = "-g " ;
53+ $ filter [] = "48 " ;
54+ $ filter [] = "-keyint_min " ;
55+ $ filter [] = "48 " ;
56+ $ filter [] = "-hls_list_size " ;
57+ $ filter [] = "0 " ;
58+ $ filter [] = "-hls_time " ;
59+ $ filter [] = $ hls ->getHlsTime ();
60+ $ filter [] = "-hls_allow_cache " ;
61+ $ filter [] = (int )$ hls ->isHlsAllowCache ();
62+ $ filter [] = "-b:v " ;
63+ $ filter [] = $ representation ->getKiloBitrate () . "k " ;
64+ $ filter [] = "-maxrate " ;
65+ $ filter [] = intval ($ representation ->getKiloBitrate () * 1.2 ) . "k " ;
66+ $ filter [] = "-hls_segment_filename " ;
67+ $ filter [] = $ dirname . "/ " . $ ts_sub_dir . $ path_parts ["filename " ] . "_ " . $ representation ->getHeight () . "p_%04d.ts " ;
68+ $ filter = array_merge ($ filter , $ this ->getBaseURL ($ base_url ));
69+ $ filter = array_merge ($ filter , $ this ->getKeyInfo ($ hls ));
70+ $ filter [] = "-strict " ;
71+ $ filter [] = $ hls ->getStrict ();
72+
73+ if (end ($ representations ) !== $ representation ) {
74+ $ filter [] = $ dirname . "/ " . $ path_parts ["filename " ] . "_ " . $ representation ->getHeight () . "p.m3u8 " ;
75+ }
76+ }
77+
78+ return $ filter ;
79+ }
80+
81+ /**
82+ * @param HLS $hls
83+ * @param $dirname
84+ * @return array
85+ */
86+ private function getSubDirectory (HLS $ hls , $ dirname )
87+ {
4288 $ ts_sub_dir = Utilities::appendSlash ($ hls ->getTsSubDirectory ());
4389 $ base_url = Utilities::appendSlash ($ hls ->getHlsBaseUrl ());
4490
@@ -47,49 +93,42 @@ private function HLSFilter(HLS $hls)
4793 $ base_url = $ base_url . $ hls ->getTsSubDirectory () . "/ " ;
4894 }
4995
50- foreach ($ representations as $ representation ) {
51- if ($ representation instanceof Representation) {
52- $ filter [] = "-s:v " ;
53- $ filter [] = $ representation ->getResize ();
54- $ filter [] = "-crf " ;
55- $ filter [] = "20 " ;
56- $ filter [] = "-sc_threshold " ;
57- $ filter [] = "0 " ;
58- $ filter [] = "-g " ;
59- $ filter [] = "48 " ;
60- $ filter [] = "-keyint_min " ;
61- $ filter [] = "48 " ;
62- $ filter [] = "-hls_list_size " ;
63- $ filter [] = "0 " ;
64- $ filter [] = "-hls_time " ;
65- $ filter [] = $ hls ->getHlsTime ();
66- $ filter [] = "-hls_allow_cache " ;
67- $ filter [] = (int )$ hls ->isHlsAllowCache ();
68- $ filter [] = "-b:v " ;
69- $ filter [] = $ representation ->getKiloBitrate () . "k " ;
70- $ filter [] = "-maxrate " ;
71- $ filter [] = intval ($ representation ->getKiloBitrate () * 1.2 ) . "k " ;
72- $ filter [] = "-hls_segment_filename " ;
73- $ filter [] = $ dirname . "/ " . $ ts_sub_dir . $ filename . "_ " . $ representation ->getHeight () . "p_%04d.ts " ;
74-
75- if ($ base_url ) {
76- $ filter [] = "-hls_base_url " ;
77- $ filter [] = $ base_url ;
78- }
79-
80- if ($ hls ->getHlsKeyInfoFile ()) {
81- $ filter [] = "-hls_key_info_file " ;
82- $ filter [] = $ hls ->getHlsKeyInfoFile ();
83- }
84-
85- $ filter [] = "-strict " ;
86- $ filter [] = $ hls ->getStrict ();
87-
88- if (++$ counter !== $ total_count ) {
89- $ filter [] = $ dirname . "/ " . $ filename . "_ " . $ representation ->getHeight () . "p.m3u8 " ;
90- }
91- }
96+ return [$ ts_sub_dir , $ base_url ];
97+ }
98+
99+ private function getFormats (HLS $ hls )
100+ {
101+ $ format = ['-c:v ' , $ hls ->getFormat ()->getVideoCodec ()];
102+
103+ $ audio_format = $ hls ->getFormat ()->getAudioCodec ();
104+ if ($ audio_format ) {
105+ $ format = array_merge ($ format , ['-c:a ' , $ audio_format ]);
106+ }
107+
108+ return $ format ;
109+ }
110+
111+ private function getBaseURL ($ base_url )
112+ {
113+ $ filter = [];
114+
115+ if ($ base_url ) {
116+ $ filter [] = "-hls_base_url " ;
117+ $ filter [] = $ base_url ;
92118 }
119+
120+ return $ filter ;
121+ }
122+
123+ private function getKeyInfo (HLS $ hls )
124+ {
125+ $ filter = [];
126+
127+ if ($ hls ->getHlsKeyInfoFile ()) {
128+ $ filter [] = "-hls_key_info_file " ;
129+ $ filter [] = $ hls ->getHlsKeyInfoFile ();
130+ }
131+
93132 return $ filter ;
94133 }
95134}
0 commit comments