ios上传音频文件到服务器,IOS开发:iPod的音乐库中的音频如何上传到服务器中...
最近在做的项目里有一个功能,就是拿到手机媒体库中的音频文件,并实现APP中的播放,已经转成MP3格式上传到服务器上。
首先是要能获取到ipod library中的音频。这里我用的是MPMediaQuery,在这里有一个坑,可以拿到的歌曲中有很多歌曲的AssetURL为nil,这是因为MPMediaQuery只能拿到用户通过itunes倒入进去的歌曲url。
代码如下:
// 1.创建媒体选择队列(从ipod库中读出音乐文件)
MPMediaQuery*everything = [[MPMediaQueryalloc]init];
// 2.创建读取条件(类似于对数据做一个筛选) Value:作用等同于MPMediaType枚值
MPMediaPropertyPredicate*albumNamePredicate =
[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypeMusic ] forProperty: MPMediaItemPropertyMediaType];
//3.给队列添加读取条件
[everythingaddFilterPredicate:albumNamePredicate];
//4.从队列中获取符合条件的数组集合
NSArray*itemsFromGenericQuery = [everythingitems];
//5.便利解析数据
for(MPMediaItem*songinitemsFromGenericQuery) {
//歌曲名字
> NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
//歌曲路径
NSString *url = [song valueForProperty: MPMediaItemPropertyAssetURL];
//歌手
NSString *songer = [song valueForProperty: MPMediaItemPropertyArtist];
}
拿到后肯定是实现APP中的播放,这个就很简单了。采用AVAudioPlayer就好了
经过一番查阅,最终找到一个办法,就是先把它转为caf 写到内存里,然后再把.caf转为.mp3 就可以上传了。这里caf转mp3需要使用第三方库:lame (lame三库的资源)
代码如下:
1.导出成caf格式,这种导出方式,文件名必须以.caf作为后缀
- (void)convertToCAF:(NSString *)songUrl name:(NSString *)songName
{
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[UsingHUD showInView:self.view text:@"正在处理,请稍等..."];
});
NSURL *url = [NSURL URLWithString:songUrl];
//由于中文歌名不行 这边采用时间戳
NSString *fileName = [NSString stringWithFormat:@"%@.caf",[self getTimestamp]];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:url options:nil];
NSError *assetError = nil;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:songAsset
error:&assetError];
if (assetError) {
NSLog (@"error: %@", assetError);
return;
}
AVAssetReaderOutput *assetReaderOutput = [AVAssetReaderAudioMixOutput
assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks
audioSettings: nil];
if (! [assetReader canAddOutput: assetReaderOutput]) {
NSLog (@"can't add reader output... die!");
return;
}
[assetReader addOutput: assetReaderOutput];
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [dirs objectAtIndex:0];
NSString *exportPath = [documentsDirectoryPath stringByAppendingPathComponent:fileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) {
[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}
NSURL *exportURL = [NSURL fileURLWithPath:exportPath];
AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:exportURL
fileType:AVFileTypeCoreAudioFormat
error:&assetError];
if (assetError) {
NSLog (@"error: %@", assetError);
return;
}
AudioChannelLayout channelLayout;
memset(&channelLayout, 0, sizeof(AudioChannelLayout));
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt:2], AVNumberOfChannelsKey,
[NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
nil];
AVAssetWriterInput *assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio
outputSettings:outputSettings];
if ([assetWriter canAddInput:assetWriterInput]) {
[assetWriter addInput:assetWriterInput];
} else {
NSLog (@"can't add asset writer input... die!");
return;
}
assetWriterInput.expectsMediaDataInRealTime = NO;
[assetWriter startWriting];
[assetReader startReading];
AVAssetTrack *soundTrack = [songAsset.tracks objectAtIndex:0];
CMTime startTime = CMTimeMake (0, soundTrack.naturalTimeScale);
[assetWriter startSessionAtSourceTime: startTime];
__block UInt64 convertedByteCount = 0;
dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);
[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
usingBlock: ^
{
// NSLog (@"top of block");
while (assetWriterInput.readyForMoreMediaData) {
CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
if (nextBuffer) {
// append buffer
[assetWriterInput appendSampleBuffer: nextBuffer];
// NSLog (@"appended a buffer (%d bytes)",
// CMSampleBufferGetTotalSampleSize (nextBuffer));
convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer);
} else {
// done!
[assetWriterInput markAsFinished];
[assetWriter finishWriting];
[assetReader cancelReading];
NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]
attributesOfItemAtPath:exportPath
error:nil];
//实现caf 转mp3
[self audioCAFtoMP3:exportPath];
NSLog (@"done. file size is %lld",
[outputFileAttributes fileSize]);
break;
}
}
}];
}
2.caf >mp3
- (void)audioCAFtoMP3:(NSString *)wavPath {
NSString *cafFilePath = wavPath;
NSString *mp3FilePath = [NSString stringWithFormat:@"%@.mp3",[NSString stringWithFormat:@"%@",[cafFilePath substringToIndex:cafFilePath.length - 4]]];
@try {
int read, write;
FILE *pcm = fopen([cafFilePath cStringUsingEncoding:1], "rb"); //source 被转换的音频文件位置
fseek(pcm, 4*1024, SEEK_CUR); //skip file header
FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置
const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192;
short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE];
lame_t lame = lame_init();
lame_set_num_channels(lame,1);//设置1为单通道,默认为2双通道
lame_set_in_samplerate(lame, 44100.0);
lame_set_VBR(lame, vbr_default);
lame_set_brate(lame,8);
lame_set_mode(lame,3);
lame_set_quality(lame,2);
lame_init_params(lame);
do {
read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
if (read == 0)
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
else
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, write, 1, mp3);
} while (read != 0);
lame_close(lame);
fclose(mp3);
fclose(pcm);
}
@catch (NSException *exception) {
NSLog(@"%@",[exception description]);
}
@finally {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[UsingHUD hideInView:self.view];
//主线程上传到oss
[self localdispose:mp3FilePath];
});
}
}
到此,大功告成~~
ios上传音频文件到服务器,IOS开发:iPod的音乐库中的音频如何上传到服务器中...相关推荐
- 微信小程序-下载文件并打开/下载视频播放视频/下载音频文件-Android和IOS调试终版
下载文件并预览: 调接口下载文件,接口返回的是.bin类型的临时文件,直接调用uniapp原生接口openDocument可能出现打不开的情况或者可能打开文件乱码异常,所以我们需要获取一下文件类型fi ...
- 基于Java的音频转发服务器_javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)...
javaCV系列文章: 补充篇: 前言:本篇文章基于javaCV-FFMPEG,关于javaCV官方是没有文档或者api文档可以参考的,所以还有很多地方需要研究: 本章对于ffmpeg的需要有一定了解 ...
- matlab如何使音频文件声音变大_如何用录音软件AU2020给音频消除噪音?只需简单几步你也可以办到...
最近有好多朋友私信我,最近头条音频频道单价很高,比视频收益还要高,大家纷纷想通过自已录制音频上传的方式,来获取收益.问到如何才能给录好的音频文件降噪,还原出自已真实的声音,得到一个好的音质.而对于平时 ...
- 如何把音频文件音量调大?三种方法帮你放大音频音量
大家想象一下,当你正在观看一部电影或听一首音乐,但由于音频的音量太小了,需要我们自己不断调整音量才能勉强听得清楚,这对于我们来说一种很糟糕的体验.其实这个时候,我们可以借助一些音频编辑处理工具来进行音 ...
- android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...
Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...
- 如何录制音频文件mp3?给你推荐好用的几款音频录制软件
其实我们生活中对于音频录制的需求是比较大的,比如开会的时候为了防止漏掉要点,又或者在上课的时候老师语速过快我们来不及记笔记,这些情况出现的时候我们都可以用录音来解决这些问题.那今天在这里我也跟 ...
- h5移动端播放amr格式的音频文件兼容安卓IOS
基于amr.js和RecorderJs,最底部有线上demo代码 播放 AMR: var amr = new BenzAMRRecorder(); amr.initWithUrl('path/to/v ...
- python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)
最近心血来潮想利用 python构建一个智能语音聊天机器人,这样就能在我们无聊的时候和我们聊天以此打发时间啦:). 要想最终实现聊天机器人的构建需要经过一系列过程功能的实现,大致思路为程序接受用户的语 ...
- 【iOS开发】AFNetworking上传语音文件(.mp3)到服务器
一.业务环境 将本地的录音文件 .caf 文件通过网络上传到服务器,服务器将此文件保存为 .mp3 格式. 二.实现思路 ( 1 ) 通过使用AVAudioRecorder,将录音文件保存到本地 ( ...
最新文章
- mongodb查询数据库中某个字段中的值包含某个字符串的方法
- Linux文件命名规则
- 【创业】创业团队的那些事(二)
- VUE2 第五天学习--过渡效果
- 请问android直接post请求登录地址成功后,webview还是现实登录界面
- 浅谈BFS模板思路(一)
- 论文解读二十七:文本行识别模型的再思考
- Java实现蛇形矩阵
- LINUX下载编译pcre
- iOS实例、类、元类
- LaTeX编写IEEE会议论文字体报错、且参考文献中会议/期刊的名字没有斜体的问题解决
- 唯众中职人工智能专业解决方案
- sumif单列求和_Sumif、Sumifs单列多条件求和
- WIN10系统“计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系“的解决办法
- 软件配置管理中基线(baseline)
- 父亲将房子过户给后代需要交税吗
- sonarqube+scanner代码质量检查
- The Sandbox 与美国时装设计师协会(CFDA)达成合作,为 Web3 和时尚搭建桥梁
- 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器
- 性能测试连载 (8)-jmeter 实战分析并发、RPS、RT 公式换算