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

Linux C++开发者进阶路线:AI Infra、高性能后端与音视频实战 C++作为高性能系统编程的核心语言,其价值在于对底层资源的直接控制能力和极致性能优化。从原理层面看,它通过RAII、零成本抽象等机制实现高效内存管理和运行时性能,这是构建高并发、低延迟系统的技术基础。在工程实践中,这种能力直接转化为在AI基础设施、分布式后端、音视频处理等场景中的技术优势,例如支撑大模型推理引擎、金融交易系统、实时音视频传输等关键应用。特别是在当前AI Infra和音视频开发领域,C++与CUDA、FFmpeg、epoll等技术的结合,成为解决计算密集型和I/O密集型问题的标准方案。本文聚焦 阅读详情

    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位置存储数据。否则播放效果将有很大的影响。



 

【信息科学与工程学】计算机科学与自动化——第八十四篇 C++分布式软件高并发/高可用算法01 4. 提交:协调者选择提交时间戳(>所有读时间戳),两阶段提交:a) 写意图预提交到所有参与者,b) 参与者持久化后确认,c) 协调者决定提交,异步清理意图。:客户端请求发送到协调节点,协调节点根据路由转发到主分片所在节点。Span有父子关系。1. 索引文档:客户端发送PUT请求到协调节点,协调节点路由到主分片节点,主分片写入本地,然后并行复制到副本分片,等待确认后响应客户端。3. 搜索:客户端发送搜索请求到协调节点,协调节点广播到所有相关分片,每个分片执行查询,返回结果,协调节点合并、排序、分页后返回。 阅读详情

相关推荐

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速)

本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。

peach的博客 961

(转)libcurl库使用方法,好长,好详细。

一、ibcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP这些协议,同时支持使用SSL证书的安全文件传输:HTTP POST, HTTP PUT, FTP 上传, 基于HTTP形式的上传、代理、Co

hackermengzhi的博客 2889

基于迁移学习的花卉识别系统

本研究采用了预训练的经典深度学习模型,包括ResNet、AlexNet和VGG,通过微调的方式在Oxford-102数据集和一个自制花卉数据集上进行训练,并对图像进行了多种数据增强操作,以提高模型的泛化能力,致力于实现花卉的高效分类。

m0_71146337的博客 2376

调用curl

头文件: #include #include #include #include "curl/curl.h" #include "downloadinterfaceImpl.h" #pragma comment(lib,"libcurl.lib") using namespace std; #define SKIP_PEER_VERIFICATION 1 #p

baidu_18286109的专栏 583

【MATLAB】嵌入式PID控制参数整定与优化

本文提出了一种基于MATLAB仿真的嵌入式PID参数优化方法,解决了传统人工试凑法效率低、适应性差的问题。通过建立一阶滞后被控对象模型,对比分析了不同PID参数组合的性能表现,筛选出最优参数。仿真结果表明,优化后的PID参数能有效降低超调量(从传统方法的显著超调降至接近0%),缩短调节时间,提高稳态精度。最终将优化算法部署到STM32平台,实现了"仿真整定-参数优化-嵌入式落地"的完整开发流程。该方法显著提升了嵌入式系统的响应速度和控制精度,为工业控制应用提供了标准化解决方案。

unber的博客 45

弱小目标检测跟踪算法研究(5) 基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制

基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制1. 前言2. 顶帽变换(Top_hat)算法3. Matlab仿真4. 小结 1. 前言 红外图像中的弱小目标,目标属性包涵“弱"和“小’’两个方面:“弱’’是指目标在红外波长上所表现出来的强度,具体反映到所拍摄的红外图像上,就是指目标的灰度值;而“小’’是指目标的尺寸大小,也就是前面所述的成像面积很小,反映到红外图像上就是指目标所占的像素数目很少。 SPIE国际光学工程学会(Societyof Photo一0ptical Instrument

sinat_34897952的博客 5292

libcurl库具体使用方法

一、概述 libcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP这些协议,同时支持...

$好记性还是要多记录$ 2736

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

Ubuntu 22.04 搭建 Nginx-RTMP 流媒体服务器实战指南

流媒体服务器是实现实时音视频分发的核心基础设施,其本质是协议转换与低延迟分发系统。RTMP 协议凭借低开销、高实时性成为主流推流标准,而 HLS 则是 Web 和移动端兼容性最佳的播放协议。Nginx-RTMP 模块通过轻量级设计,在 Nginx HTTP 服务基础上扩展 RTMP 支持,实现推流接收、转封装(RTMP→HLS/DASH)、切片管理与权限控制一体化。该方案技术价值在于完全自主可控、零第三方依赖、极低资源占用,特别适用于内网监控、工业产线、远程实验等对延迟敏感(<800ms)、并发稳定(200

weixin_30435261的博客 424

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2280

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3929

HLS直播预取视频并更新m3u8

#!/usr/bin/python27 import json import threading import urllib import sys import hashlib import time import commands class myThread(threading.Thread): def __init__(self, url): threading.Th

dicc9527的专栏 1万+

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

C++ LibCurl 库的使用方法

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括`HTTP`、`FTP`、`SMTP`、`POP3`等协议的功能,使用`libcurl`可以方便地进行网络数据传输操作,如发送`HTTP`请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。

微软技术分享 7770

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Curl的移植编译以及注意事项

最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下。 1、移植编译 ./configure --prefix=$(PWD)/build --host=arm-XXX-linux; make; make install 这步基本都没有问题,生成的动态链接库libcurl.a,可以直接给应用程序去使用。 2、API使用 1)全局初始化 curl_global_init(CURL_GLOBAL_ALL); ...

zhubao124的博客 1662

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

libcurl 使用方法简介

背景 简介 使用方法 1、easy interface使用方法 2、multi interface使用方法 背景 最近想做一个简单的HLS拉流程序,HTTP的下载部分觉得采用libcurl来进行比较合适及方便,所以先介绍libcurl的基本用法,然后使用libcurl完成一个简单的下载小程序。 简介 libcurl是一个跨平台的开源网络...

ws1296931325的博客 876

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Libcurl简明使用指南

Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持Windows,Unix,Linux等,线程安全,支持Ipv6。并且易于使用。 http://curl.haxx.se/libcurl/ 从http://curl.haxx.se/libcurl/ 下载一个稳定的

把握自己。 3282

curl操作之Get/Post/上传文件 参数设置以及调用细节

curl操作之Get/Post/上传文件 参数设置以及调用细节

John_ToStr的博客 4967

libcurl库使用

libcurl库使用

会打莎士比亚的猴子的博客 573

libcurl库的介绍和使用,并调用libcurl库编程访问百度主页

libcurl库的介绍和使用,并调用libcurl库编程访问百度主页

Li_t0010的博客 2650

libcurl的使用

将尝试为传输重用相同的连接,从而操作更快,CPU密集度更低,并且使用更少的网络资源。还提供了一组钩子函数,可以轻松地与其他 URL 相关的功能(如 FTP 和 Telnet 协议)一起使用。不是线程安全的,并且可能导致资源问题,因为没有相应的清理。进行任意数量的调用,如果打算传输多个文件,鼓励这样做,这样。此函数必须是第一个要调用的函数,它返回一个。,则返回非零时,错误缓冲区中将显示可读错误消息。如何操作,通过设置适当的选项,应用程序可以更改。界面中其他函数的输入。调用,并将按照选项中的描述执行传输。

weixin_45977690的博客 935

libcurl基本使用 -- libcurl

前段时间写了个linux下的多线程下载工具, 使用到了强大的libcurl库. 现将libcurl的使用总结如下: 关于libcurl的文章网络上很多, 这里不再描述. 以下是如何使用libcurl的例子. 一、常用函数     1) libcurl的全局初始化及释放      CURLcode curl_global_init(long flags)

《我是你的正能量》 1459

使用libcurl实现的下载器

libcurl的主页:http://curl.haxx.se/ 头文件: /********************************************************************** * Copyright (C) 2014 -  - All Rights Reserved * * 文件名称:        Downloader_LibCurl.

RobertBaker的专栏 4653
上一篇: VLS 播放M3U8文件
下一篇: (HLS播放器之三)播放数据缓存机制之环形buffer
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

不会唱歌的老樊

老少爷们,来个赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值