代码拉取完成,页面将自动刷新
#include "stdafx.h"
#include "uv.h"
#include "HttpLiveServer.h"
#include "HlsWorker.h"
#include "LiveClient.h"
namespace HttpWsServer
{
static map<string,CHlsWorker*> m_workerMapHls;
static CriticalSection m_csHls;
static map<string, uint64_t> m_lives;
static FILE *m_fall = NULL;
//////////////////////////////////////////////////////////////////////////
CHlsWorker::CHlsWorker(string strCode)
: m_strCode(strCode)
, m_nType(0)
, m_nID(0)
, m_pLive(nullptr){
m_nLastVistTime = time(NULL);
m_pLive = LiveClient::GetWorker(strCode);
if(m_pLive)
m_pLive->AddHandle(this, HandleType::ts_handle, 1);
m_fall = fopen("all.ts","wb");
}
CHlsWorker::~CHlsWorker()
{
if(m_pLive)
m_pLive->RemoveHandle(this);
Log::debug("CHttpWorker release");
}
bool CHlsWorker::AddConnect(pss_http_ws_live* pss)
{
//pss->pss_next = m_pPssList;
m_pPssList = pss;
return true;
}
bool CHlsWorker::DelConnect(pss_http_ws_live* pss)
{
//lws_ll_fwd_remove(pss_http_ws_live, pss_next, pss, m_pPssList);
return true;
}
AV_BUFF CHlsWorker::GetHeader()
{
m_nLastVistTime = time(nullptr);
AV_BUFF ret = {AV_TYPE::TS, NULL, 0};
if(m_listTs.empty())
return ret;
stringstream ss;
ss << "#EXTM3U\n#EXT-X-TARGETDURATION:1\n";
int nNum = 0;
//MutexShareLock lock(&m_rwLock);
list<TS_BUFF>::reverse_iterator rIt = m_listTs.rbegin();
while(rIt != m_listTs.rend() && nNum < 10)
{
if (nNum == 0)
{
ss << "#EXT-X-MEDIA-SEQUENCE:" << rIt->nID << "\n\n";
}
ss << "#EXTINF:1\n" << m_strCode << "/" << rIt->nID << ".ts\n";
rIt++;
nNum++;
}
string strM3U8 = ss.str();
ret.nLen = strM3U8.size();
ret.pData = (char*)malloc(ret.nLen);
memcpy(ret.pData, strM3U8.c_str(), strM3U8.size());
return ret;
}
AV_BUFF CHlsWorker::GetVideo(uint64_t id)
{
m_nLastVistTime = time(nullptr);
//MutexShareLock lock(&m_rwLock);
for (auto rIt = m_listTs.rbegin(); rIt != m_listTs.rend(); ++rIt)
{
if (rIt->nID == id)
{
return rIt->buff;
}
}
AV_BUFF ret = {AV_TYPE::NONE,nullptr,0};
return ret;
}
void CHlsWorker::play_answer(int ret, string error_info)
{
}
void CHlsWorker::push_video_stream(AV_BUFF buff)
{
TS_BUFF ts;
ts.nID = m_nID++;
ts.buff = buff;
m_listTs.push_back(ts);
char tmp[100]={0};
sprintf(tmp, "T%04d.ts", ts.nID);
FILE* f = fopen(tmp, "wb");
fwrite(ts.buff.pData, 1, ts.buff.nLen, f);
fclose(f);
fwrite(ts.buff.pData, 1, ts.buff.nLen, m_fall);
fflush(m_fall);
while (m_listTs.size() > 100)
{
TS_BUFF& firstTs = m_listTs.front();
if (firstTs.buff.pData!=nullptr){
free(firstTs.buff.pData);
}
m_listTs.pop_front();
}
//lws_start_foreach_llp_safe(pss_http_ws_live **, ppss, m_pPssList, pss_next) {
// lws_callback_on_writable((*ppss)->wsi);
//} lws_end_foreach_llp_safe(ppss);
m_pPssList = NULL;
}
void CHlsWorker::stop()
{
//视频源没有数据并超时
Log::debug("no data recived any more, stopped");
//断开所有客户端连接
//lws_start_foreach_llp_safe(pss_http_ws_live **, ppss, m_pPssList, pss_next) {
// lws_set_timeout((*ppss)->wsi, PENDING_TIMEOUT_CLOSE_SEND, LWS_TO_KILL_ASYNC);
//} lws_end_foreach_llp_safe(ppss);
}
LiveClient::ClientInfo CHlsWorker::get_clients_info()
{
//vector<LiveClient::ClientInfo> ret;
//lws_start_foreach_llp(pss_http_ws_live **, ppss, m_pPssList) {
// LiveClient::ClientInfo info;
// info.devCode = m_strCode;
// info.connect = "HLS";
// info.media = "TS";
// info.clientIP= (*ppss)->clientIP;
// ret.push_back(info);
//} lws_end_foreach_llp(ppss, pss_next);
//return ret;
LiveClient::ClientInfo info;
return info;
}
//////////////////////////////////////////////////////////////////////////
CHlsWorker* CreatHlsWorker(string strCode)
{
Log::debug("CreatHlsWorker begin");
CHlsWorker* pNew = new CHlsWorker(strCode);
MutexLock lock(&m_csHls);
m_workerMapHls.insert(make_pair(strCode, pNew));
return pNew;
}
CHlsWorker* GetHlsWorker(string strCode)
{
//Log::debug("GetWorker begin");
MutexLock lock(&m_csHls);
auto itFind = m_workerMapHls.find(strCode);
if (itFind != m_workerMapHls.end()) {
return itFind->second;
}
//Log::error("GetWorker failed: %s",strCode.c_str());
return nullptr;
}
bool DelHlsWorker(string strCode)
{
MutexLock lock(&m_csHls);
auto itFind = m_workerMapHls.find(strCode);
if (itFind != m_workerMapHls.end()) {
SAFE_DELETE(itFind->second);
m_workerMapHls.erase(itFind);
return true;
}
Log::error("dosn't find worker object");
return false;
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。