最近在做的项目里有一个功能,就是拿到手机媒体库中的音频文件,并实现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的音乐库中的音频如何上传到服务器中...相关推荐

  1. 微信小程序-下载文件并打开/下载视频播放视频/下载音频文件-Android和IOS调试终版

    下载文件并预览: 调接口下载文件,接口返回的是.bin类型的临时文件,直接调用uniapp原生接口openDocument可能出现打不开的情况或者可能打开文件乱码异常,所以我们需要获取一下文件类型fi ...

  2. 基于Java的音频转发服务器_javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)...

    javaCV系列文章: 补充篇: 前言:本篇文章基于javaCV-FFMPEG,关于javaCV官方是没有文档或者api文档可以参考的,所以还有很多地方需要研究: 本章对于ffmpeg的需要有一定了解 ...

  3. matlab如何使音频文件声音变大_如何用录音软件AU2020给音频消除噪音?只需简单几步你也可以办到...

    最近有好多朋友私信我,最近头条音频频道单价很高,比视频收益还要高,大家纷纷想通过自已录制音频上传的方式,来获取收益.问到如何才能给录好的音频文件降噪,还原出自已真实的声音,得到一个好的音质.而对于平时 ...

  4. 如何把音频文件音量调大?三种方法帮你放大音频音量

    大家想象一下,当你正在观看一部电影或听一首音乐,但由于音频的音量太小了,需要我们自己不断调整音量才能勉强听得清楚,这对于我们来说一种很糟糕的体验.其实这个时候,我们可以借助一些音频编辑处理工具来进行音 ...

  5. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  6. 如何录制音频文件mp3?给你推荐好用的几款音频录制软件

        其实我们生活中对于音频录制的需求是比较大的,比如开会的时候为了防止漏掉要点,又或者在上课的时候老师语速过快我们来不及记笔记,这些情况出现的时候我们都可以用录音来解决这些问题.那今天在这里我也跟 ...

  7. h5移动端播放amr格式的音频文件兼容安卓IOS

    基于amr.js和RecorderJs,最底部有线上demo代码 播放 AMR: var amr = new BenzAMRRecorder(); amr.initWithUrl('path/to/v ...

  8. python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)

    最近心血来潮想利用 python构建一个智能语音聊天机器人,这样就能在我们无聊的时候和我们聊天以此打发时间啦:). 要想最终实现聊天机器人的构建需要经过一系列过程功能的实现,大致思路为程序接受用户的语 ...

  9. 【iOS开发】AFNetworking上传语音文件(.mp3)到服务器

    一.业务环境 将本地的录音文件 .caf 文件通过网络上传到服务器,服务器将此文件保存为 .mp3 格式. 二.实现思路 ( 1 ) 通过使用AVAudioRecorder,将录音文件保存到本地 ( ...

最新文章

  1. mongodb查询数据库中某个字段中的值包含某个字符串的方法
  2. Linux文件命名规则
  3. 【创业】创业团队的那些事(二)
  4. VUE2 第五天学习--过渡效果
  5. 请问android直接post请求登录地址成功后,webview还是现实登录界面
  6. 浅谈BFS模板思路(一)
  7. 论文解读二十七:文本行识别模型的再思考
  8. Java实现蛇形矩阵
  9. LINUX下载编译pcre
  10. iOS实例、类、元类
  11. LaTeX编写IEEE会议论文字体报错、且参考文献中会议/期刊的名字没有斜体的问题解决
  12. 唯众中职人工智能专业解决方案
  13. sumif单列求和_Sumif、Sumifs单列多条件求和
  14. WIN10系统“计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系“的解决办法
  15. 软件配置管理中基线(baseline)
  16. 父亲将房子过户给后代需要交税吗
  17. sonarqube+scanner代码质量检查
  18. The Sandbox 与美国时装设计师协会(CFDA)达成合作,为 Web3 和时尚搭建桥梁
  19. 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器
  20. 性能测试连载 (8)-jmeter 实战分析并发、RPS、RT 公式换算

热门文章

  1. 求最大公约数——辗转相除法
  2. php小程序onload,微信小程序 loading 组件实例详解
  3. java 假设当前时间_Java中与日期和时间相关的类和方法
  4. FPGA中计数器设计探索
  5. 第二个冲刺周期第二天
  6. VBS基础篇 - Dictionary对象
  7. Oracle中的伪列
  8. 由硬盘供电不稳、数据线品质差造成的蓝屏
  9. 用VC创建程序启动画面
  10. 零窗口探测怎么抓包_万事俱备,只待“窗口”!航天任务中的重要环节:“发射窗口”!...