通过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. jQuery学习笔记1——操作属性

    一.获得和设置内容 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容, 得到匹配元素集合中每个元素的文本内容结合,包括他们的后代, 即由所有匹配 ...

  2. js禁止别人查看源码

    1.直接按F12 2.Ctrl+Shift+I查看 3.鼠标点击右键查看 4.Ctrl+u=view-source:+url 把以上三种状态都屏蔽掉就可以了,document有onkeydown(键盘 ...

  3. ASP.NET实现推送文件到浏览器的方法

    这篇文章主要介绍了ASP.NET实现推送文件到浏览器的方法,可实现将文件推送到浏览器供用户浏览或下载的功能,需要的朋友可以参考下 本文实例讲述了ASP.NET实现推送文件到浏览器的方法.分享给大家供大 ...

  4. Node.js 入门 资源

    Node.js 入门 <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm ...

  5. libevent(1)

    很多时候,除了响应事件之外,应用还希望做一定的数据缓冲.比如说,写入数据的时候,通常的运行模式是: l 决定要向连接写入一些数据,把数据放入到缓冲区中 l 等待连接可以写入 l 写入尽量多的数据 l  ...

  6. Python2在Sublime Text3中print中文时编译报错解决办法

    如果是用记事本新建的python文件,有可能是由于记事本默认的ascii格式导致的,这个时候只需要在Sublime Text3中   文件->设置文件编码(utf-8),保存即可.这样能够解决的 ...

  7. virtualbox mac-debian共享文件夹

    1 这篇笔记所要解决的问题 How to Install VirtualBox Guest Additions in Debian 9 Virtual Machine 不需要管host os的类型. ...

  8. create-trigger-insert-pwd

    delimiter | drop trigger if exists default_insert_Pwd; create trigger default_insert_Pwd before inse ...

  9. 9.JavaScript简单计算器的实现

    1.难点,怎么获取标签的值,注意点,获取到的值都是string类型,还要转换 var num1 = parseInt(document.getElementById("num1") ...

  10. plotly绘制直方图示例

    计算数值出现的次数“ import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippag ...