@@ -16,6 +16,56 @@ const HLS_ATTRIBUTE_REGEXP = new RegExp(
16
16
"g"
17
17
) ;
18
18
19
+ const guessCodec = (
20
+ codecs : string [ ]
21
+ ) : { audio ?: string ; video : string } | undefined => {
22
+ if ( codecs . length === 1 ) {
23
+ return {
24
+ audio : undefined ,
25
+ video : codecs [ 0 ] ,
26
+ } ;
27
+ }
28
+
29
+ if ( codecs . length >= 2 ) {
30
+ // Guess based on some of the most common codecs. There is no
31
+ // way to be 100% certain which codec belongs to which track
32
+ // in the HLS standard.
33
+ const firstIsProbablyVideo = codecs [ 0 ] . includes ( "avc" ) ;
34
+ const secondIsProbablyVideo = codecs [ 1 ] . includes ( "avc" ) ;
35
+
36
+ const firstIsProbablyAudio = codecs [ 0 ] . includes ( "mp4a" ) ;
37
+ const secondIsProbablyAudio = codecs [ 1 ] . includes ( "mp4a" ) ;
38
+
39
+ if ( firstIsProbablyVideo ) {
40
+ return {
41
+ video : codecs [ 0 ] ,
42
+ audio : codecs [ 1 ] ,
43
+ } ;
44
+ }
45
+
46
+ if ( secondIsProbablyVideo ) {
47
+ return {
48
+ video : codecs [ 1 ] ,
49
+ audio : codecs [ 0 ] ,
50
+ } ;
51
+ }
52
+
53
+ if ( firstIsProbablyAudio ) {
54
+ return {
55
+ video : codecs [ 1 ] ,
56
+ audio : codecs [ 0 ] ,
57
+ } ;
58
+ }
59
+
60
+ if ( secondIsProbablyAudio ) {
61
+ return {
62
+ video : codecs [ 0 ] ,
63
+ audio : codecs [ 1 ] ,
64
+ } ;
65
+ }
66
+ }
67
+ } ;
68
+
19
69
const BITRATE_POLL_INTERVAL = 5 * 1000 ;
20
70
21
71
export class SafariBitrateMonitor {
@@ -99,40 +149,11 @@ export class SafariBitrateMonitor {
99
149
case "CODECS" : {
100
150
const codecs = value . replace ( / " / g, "" ) . split ( "," ) ;
101
151
102
- if ( codecs . length === 1 ) {
103
- playlist . videoCodec = codecs [ 0 ] ;
104
- }
152
+ const avCodecs = guessCodec ( codecs ) ;
153
+
154
+ playlist . videoCodec = avCodecs . video ;
155
+ playlist . audioCodec = avCodecs . audio ;
105
156
106
- if ( codecs . length >= 2 ) {
107
- // Guess based on some of the most common codecs. There is no
108
- // way to be 100% certain which codec belongs to which track
109
- // in the HLS standard.
110
- const firstIsProbablyVideo = codecs [ 0 ] . includes ( "avc" ) ;
111
- const secondIsProbablyVideo = codecs [ 1 ] . includes ( "avc" ) ;
112
-
113
- const firstIsProbablyAudio = codecs [ 0 ] . includes ( "mp4" ) ;
114
- const secondIsProbablyAudio = codecs [ 1 ] . includes ( "mp4" ) ;
115
-
116
- if ( firstIsProbablyVideo ) {
117
- playlist . videoCodec = codecs [ 0 ] ;
118
- playlist . audioCodec = codecs [ 1 ] ;
119
- }
120
-
121
- if ( secondIsProbablyVideo ) {
122
- playlist . videoCodec = codecs [ 1 ] ;
123
- playlist . audioCodec = codecs [ 0 ] ;
124
- }
125
-
126
- if ( firstIsProbablyAudio ) {
127
- playlist . videoCodec = codecs [ 1 ] ;
128
- playlist . audioCodec = codecs [ 0 ] ;
129
- }
130
-
131
- if ( secondIsProbablyAudio ) {
132
- playlist . videoCodec = codecs [ 0 ] ;
133
- playlist . audioCodec = codecs [ 1 ] ;
134
- }
135
- }
136
157
break ;
137
158
}
138
159
case "FRAME-RATE" :
@@ -149,7 +170,7 @@ export class SafariBitrateMonitor {
149
170
}
150
171
}
151
172
} ) ;
152
- console . log ( "play" , playlists )
173
+ console . log ( "play" , playlists ) ;
153
174
return playlists ;
154
175
}
155
176
0 commit comments