Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
brainfood
/
videojs-contrib-hls
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
467fa2fe
authored
2014-01-13 08:33:17 -0800
by
Tom Johnson
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
update intra segment seek to use pts for millisecond level accuracy
1 parent
3c5fb8b7
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
37 additions
and
55 deletions
src/flv-tag.js
src/videojs-hls.js
src/flv-tag.js
View file @
467fa2f
...
...
@@ -296,8 +296,8 @@ hls.FlvTag = function(type, extraData) {
// trim down the byte buffer to what is actually being used
this
.
bytes
=
this
.
bytes
.
subarray
(
0
,
this
.
length
);
this
.
frameTime
=
hls
.
FlvTag
.
frameTime
(
this
.
bytes
);
console
.
assert
(
this
.
bytes
.
byteLength
===
this
.
length
);
return
this
;
};
};
...
...
src/videojs-hls.js
View file @
467fa2f
...
...
@@ -80,6 +80,7 @@ var
mediaSource
=
new
videojs
.
MediaSource
(),
segmentParser
=
new
videojs
.
hls
.
SegmentParser
(),
player
=
this
,
tech
,
extname
,
srcUrl
,
...
...
@@ -109,33 +110,27 @@ var
return
1
;
// HAVE_METADATA
};
player
.
currentTime
=
function
(
value
)
{
var
returnValue
;
player
.
on
(
'ready'
,
function
()
{
player
.
muted
(
true
);
tech
=
player
.
el
().
querySelector
(
'.vjs-tech'
);
tech
.
vjs_setProperty
(
'playerId'
,
player
.
P
);
});
if
(
value
)
{
try
{
player
.
el
().
getElementsByClassName
(
'vjs-tech'
)[
0
].
vjs_setProperty
(
'currentTime'
,
value
);
player
.
el
().
getElementsByClassName
(
'vjs-tech'
)[
0
].
vjs_setProperty
(
'appendBytesAction'
,
'resetSeek'
);
player
.
el
().
getElementsByClassName
(
'vjs-tech'
)[
0
].
vjs_setProperty
(
'appendBytesAction'
,
'resetBegin'
);
}
catch
(
err
)
{
player
.
on
(
'seeking'
,
function
()
{
var
seekValue
=
tech
.
vjs_getProperty
(
'lastSeekedTime'
);
player
.
hls
.
mediaIndex
=
player
.
hls
.
getSegmentIndexByTime
(
seekValue
);
fillBuffer
(
seekValue
*
1000
);
});
player
.
on
(
'waiting'
,
function
()
{
if
(
player
.
currentTime
()
>=
player
.
duration
()
&&
player
.
hls
.
isLastSegment
())
{
player
.
pause
();
player
.
trigger
(
'ended'
);
}
player
.
hls
.
sourceBuffer
.
appendBuffer
(
segmentParser
.
getFlvHeader
());
player
.
hls
.
mediaIndex
=
player
.
hls
.
selectSegmentIndexByTime
(
value
);
fillBuffer
(
value
-
player
.
hls
.
getSegmentByTime
(
value
).
timeRange
.
start
);
}
else
{
try
{
returnValue
=
player
.
el
().
getElementsByClassName
(
'vjs-tech'
)[
0
].
vjs_getProperty
(
'currentTime'
);
if
(
returnValue
>
player
.
duration
())
{
returnValue
=
player
.
duration
();
}
else
if
(
returnValue
<
0
)
{
returnValue
=
0
;
}
return
returnValue
;
}
catch
(
err
)
{
return
0
;
}
}
});
player
.
hls
.
isLastSegment
=
function
()
{
return
player
.
hls
.
mediaIndex
===
player
.
hls
.
selectPlaylist
().
segments
.
length
;
};
player
.
hls
.
getSegmentByTime
=
function
(
time
)
{
...
...
@@ -151,9 +146,8 @@ var
}
};
player
.
hls
.
selec
tSegmentIndexByTime
=
function
(
time
)
{
player
.
hls
.
ge
tSegmentIndexByTime
=
function
(
time
)
{
var
index
,
currentSegment
;
if
(
player
.
hls
.
media
&&
player
.
hls
.
media
.
segments
)
{
for
(
index
=
0
;
index
<
player
.
hls
.
media
.
segments
.
length
;
index
++
)
{
currentSegment
=
player
.
hls
.
media
.
segments
[
index
];
...
...
@@ -299,18 +293,21 @@ var
* Determines whether there is enough video data currently in the buffer
* and downloads a new segment if the buffered time is less than the goal.
*/
fillBuffer
=
function
(
intrasegmentS
econd
)
{
fillBuffer
=
function
(
millis
econd
)
{
var
buffered
=
player
.
buffered
(),
bufferedTime
=
0
,
segment
=
player
.
hls
.
media
.
segments
[
player
.
hls
.
mediaIndex
],
segmentUri
,
gotoSecond
,
startTime
;
desiredMillisecond
,
startTime
,
targetTag
,
tagIndex
,
bleedIndex
=
0
;
if
(
intrasegmentS
econd
)
if
(
millis
econd
)
{
gotoSecond
=
intrasegmentS
econd
;
desiredMillisecond
=
millis
econd
;
}
// if there is a request already in flight, do nothing
...
...
@@ -351,19 +348,16 @@ var
// transmux the segment data from MP2T to FLV
segmentParser
.
parseSegmentBinaryData
(
new
Uint8Array
(
segmentXhr
.
response
));
if
(
gotoSecond
!==
null
&&
gotoSecond
>
0
)
{
var
seekToTagIndex
=
parseInt
((
segmentParser
.
getTags
().
length
/
player
.
hls
.
selectPlaylist
().
segments
[
player
.
hls
.
mediaIndex
].
duration
)
*
gotoSecond
,
10
);
var
seekToTagCounter
=
0
;
//console.log('Go to:', gotoSecond);
//console.log('tag index:', seekToTagIndex);
//drain until where you want in the buffer
while
(
seekToTagCounter
<
seekToTagIndex
)
if
(
desiredMillisecond
!==
null
&&
desiredMillisecond
>
0
)
{
for
(
tagIndex
=
0
;
tagIndex
<
segmentParser
.
getTags
().
length
-
1
;
tagIndex
++
)
{
if
(
segmentParser
.
getTags
()[
tagIndex
].
pts
<=
desiredMillisecond
&&
segmentParser
.
getTags
()[
tagIndex
+
1
].
pts
>
desiredMillisecond
)
{
targetTag
=
tagIndex
;
}
}
while
(
bleedIndex
<
targetTag
)
{
segmentParser
.
getNextTag
();
seekToTagCounter
++
;
bleedIndex
++
;
}
}
...
...
@@ -371,18 +365,6 @@ var
player
.
hls
.
sourceBuffer
.
appendBuffer
(
segmentParser
.
getNextTag
().
bytes
,
player
);
}
/*
if(player.hls.mediaIndex === player.hsl.selectPlaylist.segments.length-1)
{
try {
// TODO - Still need to test this. This tells the Flash Player the stream is over
// player.el().getElementsByClassName('vjs-tech')[0].vjs_setProperty('appendBytesAction', 'endSequence');
} catch(err) {
}
}
*/
segmentXhr
=
null
;
player
.
hls
.
mediaIndex
++
;
...
...
Please
register
or
sign in
to post a comment