Added progressive seeking support with byte positions.
This commit is contained in:
parent
7369ff606e
commit
3a5482f18e
1 changed files with 43 additions and 5 deletions
|
@ -35,7 +35,8 @@ namespace Connector_HTTP{
|
||||||
FLV::Tag tag;///< Temporary tag buffer.
|
FLV::Tag tag;///< Temporary tag buffer.
|
||||||
|
|
||||||
unsigned int lastStats = 0;
|
unsigned int lastStats = 0;
|
||||||
unsigned int seek_pos = 0;//seek position in ms
|
unsigned int seek_sec = 0;//seek position in ms
|
||||||
|
unsigned int seek_byte = 0;//seek position in bytes
|
||||||
|
|
||||||
while (conn.connected()){
|
while (conn.connected()){
|
||||||
//only parse input if available or not yet init'ed
|
//only parse input if available or not yet init'ed
|
||||||
|
@ -50,7 +51,28 @@ namespace Connector_HTTP{
|
||||||
streamname = HTTP_R.getUrl().substr(1);
|
streamname = HTTP_R.getUrl().substr(1);
|
||||||
size_t extDot = streamname.rfind('.');
|
size_t extDot = streamname.rfind('.');
|
||||||
if (extDot != std::string::npos){streamname.resize(extDot);};//strip the extension
|
if (extDot != std::string::npos){streamname.resize(extDot);};//strip the extension
|
||||||
seek_pos = atoi(HTTP_R.GetVar("start").c_str()) * 1000;//seconds to ms
|
int start = 0;
|
||||||
|
if (!HTTP_R.GetVar("start").empty()){
|
||||||
|
start = atoi(HTTP_R.GetVar("start").c_str());
|
||||||
|
}
|
||||||
|
if (!HTTP_R.GetVar("starttime").empty()){
|
||||||
|
start = atoi(HTTP_R.GetVar("starttime").c_str());
|
||||||
|
}
|
||||||
|
if (!HTTP_R.GetVar("apstart").empty()){
|
||||||
|
start = atoi(HTTP_R.GetVar("apstart").c_str());
|
||||||
|
}
|
||||||
|
if (!HTTP_R.GetVar("ec_seek").empty()){
|
||||||
|
start = atoi(HTTP_R.GetVar("ec_seek").c_str());
|
||||||
|
}
|
||||||
|
if (!HTTP_R.GetVar("fs").empty()){
|
||||||
|
start = atoi(HTTP_R.GetVar("fs").c_str());
|
||||||
|
}
|
||||||
|
//under 3 hours we assume seconds, otherwise byte position
|
||||||
|
if (start < 10800){
|
||||||
|
seek_sec = start*1000;//ms, not s
|
||||||
|
}else{
|
||||||
|
seek_byte = start;//divide by 1mbit, then *1000 for ms.
|
||||||
|
}
|
||||||
ready4data = true;
|
ready4data = true;
|
||||||
HTTP_R.Clean(); //clean for any possible next requests
|
HTTP_R.Clean(); //clean for any possible next requests
|
||||||
}
|
}
|
||||||
|
@ -71,9 +93,25 @@ namespace Connector_HTTP{
|
||||||
ready4data = false;
|
ready4data = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (seek_pos){
|
if (seek_byte){
|
||||||
|
//wait until we have a header
|
||||||
|
while (!ss.Received().size()){
|
||||||
|
ss.spool();
|
||||||
|
Util::sleep(1);
|
||||||
|
}
|
||||||
|
Strm.parsePacket(ss.Received());//read the metadata
|
||||||
|
int byterate = 0;
|
||||||
|
if (Strm.metadata.isMember("video")){
|
||||||
|
byterate += Strm.metadata["video"]["bps"].asInt();
|
||||||
|
}
|
||||||
|
if (Strm.metadata.isMember("audio")){
|
||||||
|
byterate += Strm.metadata["audio"]["bps"].asInt();
|
||||||
|
}
|
||||||
|
seek_sec = (seek_byte / byterate) * 1000;
|
||||||
|
}
|
||||||
|
if (seek_sec){
|
||||||
std::stringstream cmd;
|
std::stringstream cmd;
|
||||||
cmd << "s " << seek_pos << "\n";
|
cmd << "s " << seek_sec << "\n";
|
||||||
ss.SendNow(cmd.str().c_str());
|
ss.SendNow(cmd.str().c_str());
|
||||||
}
|
}
|
||||||
#if DEBUG >= 3
|
#if DEBUG >= 3
|
||||||
|
|
Loading…
Add table
Reference in a new issue