c语言URL通过Http下载mp3 格式
通过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 格式的更多相关文章
- 网易云音乐ncm格式分析以及ncm与mp3格式转换
目录 NCM格式分析 音频知识简介 两种可能 GitHub项目 格式分析 总体结构 密钥问题 代码分析 main函数 导入模块 dump函数 参考资料 代码完整版 转换工具 ncmdump ncmdu ...
- 微信录音文件上传到服务器以及amr转化成MP3格式
微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...
- 微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法
微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...
- 在java中使用ffmpeg将amr格式的语音转为mp3格式
ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/. 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg ...
- MP3格式音频文件结构解析
MP3的全称是MPEG Audio Layer3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.MP3的文件,基本保持原文件的音质.MP3是ISO/MPEG标准的一 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 【做中学】第一个 Go 语言程序:漫画下载器
原文地址: 第一个 Go 语言程序:漫画下载器: https://schaepher.github.io/2020/04/11/golang-first-comic-downloader 之前学了点 ...
- Win7 SP1语言包微软官方下载地址及使用方法 2
情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...
- 在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
随机推荐
- [转]软件测试- 3 - Mock 和Stub的区别
由于一直没有完全搞明白Mock和Stub的区别,所以查了很多文章,而这一篇是做好的: http://yuan.iteye.com/blog/470418 尤其是8楼,Frostred的发言,描述地相当 ...
- herf 和 src 的区别
1.herf 表示超文本引用(hypertext reference),指向网络资源所在位置,建立和当前元素( 锚点)或当前文档(链接)之间的链接,如果我们在文档中添加 <link href=& ...
- redo
--创建redosize的视图create or replace view redo_size as select value from v$mystat, v$statname where v$my ...
- 妈妈再也不用担心我使用git了
妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...
- 系统内部集成测试(System Integration Testing) SIT 用户验收测试(User Acceptance Testing)
系统内部集成测试(System Integration Testing) SIT 用户验收测试(User Acceptance Testing) UAT SIT在前,UAT在后,UAT测完才可以上线
- ITMS-SERVICES://方式安装IPA在IOS 7.1中的变化
转:https://laoyur.com/?p=414 iOS7.1中,通过itms-services://方式安装ipa已经发生了改变,.plist文件必须是https://的,.ipa文件的链接则 ...
- Powershell Get-ChildItem 筛选文件,文件处理
使用Where-Object也可以根据其它属性来过滤. Dir | Where-Object { $_.CreationTime -gt [datetime]::Parse("May 12, ...
- 个案排秩 Rank (linear algebra) 秩 (线性代数)
非叫“秩”不可,有秩才有解_王治祥_新浪博客http://blog.sina.com.cn/s/blog_8e7bc4f801012c23.html 我在一个大学当督导的时候,一次我听一位老师给学生讲 ...
- shell判断文件/目录是否存在
https://www.cnblogs.com/37yan/p/6962563.html caution!!! if should be end with fi caution!!! there sh ...
- 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...