通过http协议下载MP3的关键就是 整块打包,一块一块向文件里面存储。读取的时候用二进制

/***
szWebAddr: 页面地址(包含host+addr)

szMp3FileName:将要存储文件的名字
szRequest: 请求内容
szHeadEx: http头附加信息(替换其默认的设置)
iReqType: 请求类型(1--Get;2--Post)
iTimeout: 超时时间(秒)
返回: 页面返回数据
**/

int  GetDataFromWebByte(char *szWebAddr,char *szMp3FileName , char *szRequest, char *szHeadEx, int iReqType, int iTimeout)
{
char szHost[] = "", szAddr[] = "";
char szWebBuf[] = "", szBuf[] = "";
char *pRetData = NULL; //返回的数据
char *szHead = NULL;
int iPort = , iAppSock;
int iRet = , iLen, k, iChars, iDone;
int iContentLen, iChunked = ;
struct sockaddr_in appHostAddr;
struct hostent *pHostent = NULL;
int iTransferType = , iContent = ;
FILE *fp;
WSADATA wsa={}; if(!szWebAddr)
return ;
WSAStartup(MAKEWORD(,),&wsa); //获取host和addr和port
iRet = GetHostandAddr(szWebAddr, szHost, sizeof(szHost), szAddr, sizeof(szAddr), &iPort);
if(iRet < )
return ; //获取hostent
pHostent = gethostbyname(szHost);
if(!pHostent)
{
iRet = WSAGetLastError(); return ;
} //创建socket
appHostAddr.sin_family = AF_INET;
appHostAddr.sin_port = htons((unsigned short)iPort);
appHostAddr.sin_addr.s_addr = ((struct in_addr *)(pHostent->h_addr))->s_addr;
iAppSock = socket(AF_INET, SOCK_STREAM, );
if(iAppSock == -)
{
return ;
} //将创建的Socket连接至应用服务器
if(connect(iAppSock, (void *)&appHostAddr, sizeof(appHostAddr)) == -)
{
return ;
} //配置httphead
szHead = GetHttpHead(szHost, szAddr, szRequest, szHeadEx, iReqType);
if(!szHead)
return ; //向应用服务器发送HTTP请求
if(send(iAppSock, szHead, strlen(szHead), ) == -){
return ;
}
free(szHead);
szHead = NULL; //接收应用服务器返回的数据
memset(szWebBuf, , sizeof(szWebBuf));
memset(szBuf, , sizeof(szBuf));
k = ;
iChars = ;
iDone = ;
//获取http头信息
while(iDone == )
{
iLen = RecvHttpData(iAppSock, szWebBuf, , iTimeout);
if(iLen < )
iDone = ;
switch(*szWebBuf)
{
case '\r':
break;
case '\n':
if(iChars == )
iDone = ;
iChars = ;
break;
default:
iChars++;
break;
}
if(k < sizeof(szBuf) - )
{
szBuf[k] = szWebBuf[];
k++;
}
else
{
pRetData = addRevData(pRetData, szBuf);
memset(szBuf, , sizeof(szBuf));
k = ;
szBuf[k] = szWebBuf[];
k++;
}
}
pRetData = addRevData(pRetData, szBuf); //获取http内容长度
//判断是否chunked
if(strstr(pRetData, "chunked"))
iChunked = ; //为chunk传输 //获取http内容
iContent = ;
do
{
if (iChunked > )
{
iContentLen = GetChunkedContentLength(iAppSock);
}
else
{
iContentLen = GetContentLength(pRetData);
}
//获取http内容
//清空数据
if(iContent == && pRetData)
{
free(pRetData);
pRetData = NULL;
iContent = ;
}
if(iContentLen < )
{
closesocket(iAppSock);
//close(iAppSock);
return ;
} //chunk
memset(szWebBuf, , sizeof(szWebBuf));
memset(szBuf, , sizeof(szBuf));
k = ;
iChars = iContentLen;
//*iLenByte = iChars;
iDone = ;
fp = fopen(szMp3FileName , "wb+");
while(iDone == )
{
iLen = RecvHttpData(iAppSock, szWebBuf, , iTimeout);
if(iLen < )
iDone = ;
iChars--;
if(iChars < )
iDone = ;
if(k < sizeof(szBuf) - )
{
szBuf[k] = szWebBuf[];
k++;
}
else
{
// puts(szBuf);
fwrite(szBuf,,,fp);
memset(szBuf, , sizeof(szBuf));
k = ;
szBuf[k] = szWebBuf[];
k++;
}
}
fclose(fp); } while (iChunked); //chunk格式才继续找 closesocket(iAppSock);
WSACleanup();
return ;
}

块的大小结合实际情况,却大越好,太小的时候,噪音的频率会很高,影响质量,具体消除噪音,以后再改进。

c语言URL通过Http下载mp3 格式的更多相关文章

  1. 网易云音乐ncm格式分析以及ncm与mp3格式转换

    目录 NCM格式分析 音频知识简介 两种可能 GitHub项目 格式分析 总体结构 密钥问题 代码分析 main函数 导入模块 dump函数 参考资料 代码完整版 转换工具 ncmdump ncmdu ...

  2. 微信录音文件上传到服务器以及amr转化成MP3格式

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

  3. 微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

  4. 在java中使用ffmpeg将amr格式的语音转为mp3格式

    ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/. 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg ...

  5. MP3格式音频文件结构解析

    MP3的全称是MPEG Audio Layer3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.MP3的文件,基本保持原文件的音质.MP3是ISO/MPEG标准的一 ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. 【做中学】第一个 Go 语言程序:漫画下载器

    原文地址: 第一个 Go 语言程序:漫画下载器: https://schaepher.github.io/2020/04/11/golang-first-comic-downloader 之前学了点 ...

  8. Win7 SP1语言包微软官方下载地址及使用方法 2

    情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...

  9. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

随机推荐

  1. 7、手把手教React Native实战之ReactJS

    ReactJS核心思想:组件化  维护自己的状态和UI  自动重新渲染 多个组件组成了一个ReactJS应用 React是全局对象   顶层API与组件API React.createClass创建组 ...

  2. 显示所有APP的进程详细信息(进程ID、进程所在UID、进程占用内存、进程名)

    main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

  3. 使用sendmail来发邮件

    安装sendEmail sendEmail是一个免费.轻量级.命令行的SMTP邮件客户端. 如果你需要使用命令行方式发送邮件,那么sendEmail是非常完美的选择:使用简单.功能强大. wget - ...

  4. 【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流

    [BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...

  5. eslint Rules

    Rules 为了让你对规则有个更好的理解,ESLint 对其进行了分门别类. 所有的规则默认都是禁用的.在配置文件中,使用 "extends": "eslint:reco ...

  6. Django设置中文,和时区、静态文件指向

    #========================================================== # 设置时区 注意注释上面的:LANGUAGE_CODE.TIME_ZONE.U ...

  7. ORACLE的测试用户Scott

    Oracle数据库的测试用户Scott的密码为什么是Tiger? 1977年6月,Larry Ellison 与 Bob Miner 和 Ed Oates 在硅谷共同创办了一家名为软件开发实验室(So ...

  8. Linux使用SecureCRT上传下载

    操作远程 Linux 系统,很多时候选用 SecureCRT 软件,在 SecureCRT 环境下,使用 lrzsz 工具可以很方便的完成文件的上传下载. 这里使用的 Ubuntu Linux 安装: ...

  9. 【转】记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

      最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServe ...

  10. Java基础—内部类(转载)

    转载自:java中的匿名内部类总结 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部 ...