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

代码:

  1. m_pCurl = curl_easy_init();
  2. if (m_pCurl == NULL)
  3. break;
  4. curl_easy_reset(m_pCurl);
  5. curl_easy_setopt(m_pCurl, CURLOPT_URL, url.c_str());
  6. curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);
  7. curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 3);
  8. //curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, 30);
  9. curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1L);
  10. //curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_LIMIT, 1);
  11. //curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_TIME, 120);    // 120s的时间内速度小于1byte/s,则取消下载
  12. curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, writeTsData_Local);
  13. curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, (LPVOID)this);
  14. m_downloadThreadFlag = true;
  15. retCode = curl_easy_perform(m_pCurl);
  16. double downloadTotalTime;   // 记录下载的时间长度
  17. double downloadSpeed;// 记录下载速度
  18. CURLcode re = curl_easy_getinfo(m_pCurl, CURLINFO_SPEED_DOWNLOAD, &downloadSpeed);  // 获取下载速度
  19. curl_easy_getinfo(m_pCurl, CURLINFO_TOTAL_TIME, &downloadTotalTime);
  20. 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时,则需要提示用户检测网络。

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

  1. size_t TsDataThread::writeTsData_Local(void *buffer, size_t size, size_t nmemb, void *userp)
  2. {
  3. if (false == downloadflag || true == isStop)
  4. return 0;
  5. if (elementSize >= preElementSize)
  6. {
  7. TsDataThread* pUDPReader = (TsDataThread*)userp;
  8. pUDPReader->addBuff(buffer, size, nmemb, userp);
  9. elementSize += nmemb;
  10. }
  11. return size*nmemb;
  12. }

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

libcurl 基本使用的更多相关文章

  1. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  2. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  3. 用libcurl 登录网站

    libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...

  4. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  5. 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

    执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...

  6. 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a

    把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...

  7. 安装zabbix报错configure: error: libcurl library not found

    libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...

  8. libcurl教程

    名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 ...

  9. Libcurl多线程crash问题(cento)

    cento :http://blog.csdn.net/delphiwcdj/article/details/18284429 1 问题背景 后台系统有一个单线程的http接口,为了提高并发处理能力, ...

  10. libcurl 函数curl_easy_perform在release下崩溃的问题

    今天遇到一个很奇怪的问题: 工程中用到了libcurl, debug可以正常运行,release每次都崩溃,断到curl_easy_perform这一行.堆栈中也得不到有用信息,于是GOOGLE一番, ...

随机推荐

  1. 利用Filter实现session拦截

    1.在web.xml中配置 <!-- Session监听器 --> <filter> <filter-name>sessionValidateFilter</ ...

  2. sql时间区间查询性能测试

    这个测试针对"一个月"的区间来查询数据.分datetime类型和nvachar类型. 先比较datetime类型: 一.datediff函数 declare @beginTime ...

  3. 互联网轻量级框架SSM-查缺补漏第一天

    简言:工欲其事必先利其器,作为一个大四的准毕业生,在实习期准备抽空补一下基础.SSM框架作为互联网的主流框架,在会使用的基础上还要了解其原理,我觉得会对未来的职场会有帮助的.我特意的买了一本<J ...

  4. 字符串(1)——Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  5. Angular6 基础(数据绑定、生命周期、父子组件通讯、响应式编程)

    Angular相比于vue来说,更像一个完整的框架,本身就集成了很多模块,如路由,HTTP,服务等,而vue是需要另外引入比如(vuex,axios等).Angular引入了依赖注入.单元测试.类等后 ...

  6. axios 发 post 请求,后端接收不到参数的解决方案

    问题场景 场景很简单,就是一个正常 axios post 请求: axios({ headers: { 'deviceCode': 'A95ZEF1-47B5-AC90BF3' }, method: ...

  7. c语言进制转化

    #include <stdio.h> // 进制转化 int main(void) { ; ; int i3 = 0x32C; printf( printf( printf("十 ...

  8. Network Request Failed

    在react native项目中,有时候调用接口会出现这样的错误提示:“Network Request Failed”. 一.模拟器上报“Network Request Failed”解决办法,也是官 ...

  9. css:改变滚动条样式

    以下亲测谷歌内核的浏览器有用,微软和火狐无效 body::-webkit-scrollbar {/*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1 ...

  10. ubuntu 火狐浏览器中常规方法安装flashplayer的问题

    之前在网上看到很多朋友介绍了许多如何在ubuntu安装flashplayer 的方法!但是我的操作系统不知怎么的就是不能成功的安装!使我十分的苦恼!但是在我纲要邪气的时候再网上又看到一位朋友的解决方案 ...