(HLS播放器之二)HTTP数据下载之libcurl 基本使用

    libcurl,在HLS流媒体播放终端上提供HTTP下载的相关接口。具体的使用方式可以参见http://curl.haxx.se/libcurl/c/libcurl-tutorial.html,或博客http://www.cppblog.com/tx7do/archive/2012/02/19/166011.html

     代码:

m_pCurl = curl_easy_init();
if (m_pCurl == NULL)
	break;
curl_easy_reset(m_pCurl);  
curl_easy_setopt(m_pCurl, CURLOPT_URL, url.c_str()); 
curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1); 
curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 3);
//curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, 30);
curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1L);
//curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_LIMIT, 1);	
//curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_TIME, 120);	 // 120s的时间内速度小于1byte/s,则取消下载
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, writeTsData_Local);
curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, (LPVOID)this);

m_downloadThreadFlag = true;
retCode = curl_easy_perform(m_pCurl);
double downloadTotalTime;	// 记录下载的时间长度
double downloadSpeed;// 记录下载速度
CURLcode re = curl_easy_getinfo(m_pCurl, CURLINFO_SPEED_DOWNLOAD, &downloadSpeed);	// 获取下载速度
curl_easy_getinfo(m_pCurl, CURLINFO_TOTAL_TIME,	&downloadTotalTime);
curl_easy_cleanup(m_pCurl);

1、void curl_easy_reset(CURL *handle );  重置CURL

2、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

      CURLOPT_URL,添加下载的URL

      CURLOPT_WRITEFUNCTION, 设置回调存储数据函数

      CURLOPT_CONNECTTIMEOUT, 设置连接超时时间

      CURLOPT_LOW_SPEED_LIMIT, 设置最低下载速度

      CURLOPT_LOW_SPEED_TIME, 设置最低下载速度持续的时间

      CURLOPT_FOLLOWLOCATION, 设置为1,否则会导致回调函数只执行一次

3、CURLcode curl_easy_perform(CURL * handle );   启动下载

4、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); 可以获取下载的相关信息,如下载时长、下载速度等。

5、void curl_easy_cleanup(CURL *curl); 关闭CURL

主要使用的就是这五个函数。建议在connectTimeOut不要设置时间过长。如果设置太长后,有时会导致退出时程序挂起现象。获取下载相关信息getInfo是必要的,可以通过它来判断程序网络连接情况。如下载时长远远大于片段播放时长,且缓存中存储的量过少时,则需要调用Pause进行数据缓冲。当下载速度为0 b/s时,则需要提示用户检测网络。

以下是数据接收的回调函数:

size_t TsDataThread::writeTsData_Local(void *buffer, size_t size, size_t nmemb, void *userp)
{
	if (false == downloadflag || true == isStop)
		return 0;
	if (elementSize >= preElementSize)
	{
		TsDataThread* pUDPReader = (TsDataThread*)userp;
		pUDPReader->addBuff(buffer, size, nmemb, userp);	
		elementSize += nmemb;
	}

	return size*nmemb; 
}

要注意如果用户中途退出,且下载线程仍再继续时,不能强制关闭CURL。通过回调中返回0值,使其正常退出CURL。还有就是如果第一次下载片度在elementSize位置处,下载失败。则在第二次下载时一定要从elementSize位置存储数据。否则播放效果将有很大的影响。



 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会唱歌的老樊

老少爷们,来个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值