通过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. 【vijos】1447 开关灯泡(高精度+特殊的技巧)

    https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...

  2. wchat_t与char互转

     C++ Code  1234567891011121314151617181920212223242526   //窄字符转宽字符 void ConvertA2W(wchar_t* the_strw ...

  3. PrintArea打印,@media screen解决移动web开发的多分辨率问题,@media print设置打印的样式

    PrintArea打印,局部DIV打印插件,依赖JQuery. github:https://github.com/RitsC/PrintArea 当打印时需要临时改变页面布局,可以使用 @media ...

  4. Java常量池详解

    转自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虚拟内存分布图: 程序计数器:JVM执行程序的流水线. 本地方法栈:JVM调用操作系统方法所 ...

  5. GRPC使用错误排查记录

    1. 编译报错 f.fr.SetReuseFrames undefined (type *http2.Framer has no field or method SetReuseFrames) 该问题 ...

  6. FineReport---函数

    1.NUMTO()需要将数字2345转换成二三四五:NUMTO(2345) 2.Toimage函数:Toimage(path)用于在报表中显示某一路径path下的图片 3.row():为获取当前行号 ...

  7. 【转】spring和springMVC的面试问题总结

    1.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authen ...

  8. 笔记-django学习链接

    form表单学习 https://www.cnblogs.com/weiman3389/p/6225075.html python字符串replace()方法 https://www.cnblogs. ...

  9. PHP的几种排序方法

    <?php /** * PHP最常用的四个排序方法及二种查找方法 * 下面的排序方法全部都通过测试 * auther : soulence * date : 2015/06/20 */ //PH ...

  10. Unity3d依赖于平台的编译

    Unity的这一功能被命名为"依赖于平台的编译". 这包括了一些预编译处理指令,让你能够专门的针对不同的平台分开编译和运行一段代码. 此外,你能够在编辑器下运行一些代码用于測试而不 ...