diff --git a/src/output/output_progressive_flv.cpp b/src/output/output_progressive_flv.cpp index 37e2a0b3..dd8bfcad 100644 --- a/src/output/output_progressive_flv.cpp +++ b/src/output/output_progressive_flv.cpp @@ -57,6 +57,13 @@ namespace Mist { opt["arg_num"] = 1ll; opt["help"] = "Target filename to store FLV file as, or - for stdout."; cfg->addOption("target", opt); + + + opt.null(); + opt["short"] = "k"; + opt["long"] = "keyframe"; + opt["help"] = "Send only a single video keyframe"; + cfg->addOption("keyframeonly", opt); } bool OutProgressiveFLV::isRecording(){ @@ -66,6 +73,9 @@ namespace Mist { void OutProgressiveFLV::sendNext(){ tag.DTSCLoader(thisPacket, myMeta.tracks[thisPacket.getTrackId()]); myConn.SendNow(tag.data, tag.len); + if (config->getBool("keyframeonly")){ + config->is_active = false; + } } void OutProgressiveFLV::sendHeader(){ @@ -76,6 +86,15 @@ namespace Mist { H.setCORSHeaders(); H.SendResponse("200", "OK", myConn); } + if (config->getBool("keyframeonly")){ + selectedTracks.clear(); + for (std::map::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){ + if (it->second.type =="video"){ + selectedTracks.insert(it->first); + break; + } + } + } myConn.SendNow(FLV::Header, 13); tag.DTSCMetaInit(myMeta, selectedTracks); @@ -88,6 +107,13 @@ namespace Mist { myConn.SendNow(tag.data, tag.len); } } + if (config->getBool("keyframeonly")){ + unsigned int tid = *selectedTracks.begin(); + int keyNum = myMeta.tracks[tid].keys.rbegin()->getNumber(); + int keyTime = myMeta.tracks[tid].getKey(keyNum).getTime(); + INFO_MSG("Seeking for time %d on track %d key %d", keyTime, tid, keyNum); + seek(keyTime); + } sentHeader = true; }