在英雄详情->配音页面中,需要实现未下载时,按钮显示下载图标,点击后下载并存储到对应页面,下载完成后,显示播放按钮,点击后可播放。如图:

直接写下载过程的代码吧:

#pragma mark点击下载按钮获取配音
- (void)downloadVoice:(UIButton *)sender{if (self.currentBtn.tag == 1009){NSFileManager *fileManager = [NSFileManager defaultManager];//self.commonVoiceList为当前配音列表//fileName为当前行对应的音频文件名(fileName ===Ashe_我们必须向前推进.mp3)NSString *fileName = [self.commonVoiceList objectAtIndex:sender.tag];//(pathName ===Ashe)NSString *pathName = self.enName;//文件路径字符串拼接,拼接后自动添加"/"//[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject]为当前app的document路径//filePath为在当前路径下添加一个名为当前英雄的子文件夹//(filePath ===/Users/yanyue/Library/Developer/CoreSimulator/Devices/E170452C-72D8-428E-9062-AF61A14758C8/data/Containers/Data/Application/B22FE59F-1B29-42DD-B8AF-ACAD9B9578F1/Documents/Ashe)NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent:pathName];//当前英雄文件夹里再添加对应配音文件NSString *file  = [filePath stringByAppendingPathComponent:fileName];//判断所要下载文件是否已存在if ([fileManager fileExistsAtPath:file]){//存在,不做任何操作NSLog(@"文件存在");}else{//不存在,创建NSLog(@"文件不存在");//创建对应文件夹[fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];//URL为配音的对应网址,并转码NSURL *URL = [NSURL URLWithString:[[NSString stringWithFormat:@"http://box.dwstatic.com/sounds/%@/%@",self.enName,[self.commonVoiceList objectAtIndex:sender.tag]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];//网络请求(网址为URL)NSURLRequest *request = [NSURLRequest requestWithURL:URL];//创建网络了操作AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];//网络操作从URL获取内容operation.inputStream  = [NSInputStream inputStreamWithURL:URL];//网络操作下载内容存在路径file里operation.outputStream = [NSOutputStream outputStreamToFileAtPath:file append:NO];[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){//网络获取成功,则重载对应行NSIndexPath *path = [NSIndexPath indexPathForRow:sender.tag inSection:0];[self.voiceTableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];}failure:^(AFHTTPRequestOperation *operation, NSError *error){}];//发出请求[operation start];}}else{//其他配音}
}

每步的意义都写在注释里了,其他配音类似。

各个路径打印结果如下:

self.commonVoiceList代表了当前TableView显示的是英雄配音列表还是其他配音列表。

对应网址和JSON解析后的内容如下:

工具->英雄->英雄详情->配音配音列表:
英雄配音:
http://box.dwstatic.com/apiHeroSound.php?hero=Ashe&v=64&OSType=iOS8.1.1&versionName=2.1.2response:
["Ashe.mp3", "Ashe_你要来几发吗.mp3", "Ashe_好好看着可别到时候不知道自己是怎么死的.mp3", "Ashe_我们必须向前推进.mp3", "Ashe_我瞄的很稳.mp3", "Ashe_明智之选.mp3", "Ashe_正对眉心.mp3"
]其他配音:
http://box.dwstatic.com/apiHeroSound.php?hero=Common&v=64&OSType=iOS8.1.1&versionName=2.1.2response:
["Common_一血.mp3", "Common_三杀.mp3", "Common_主宰比赛(六连杀).mp3", "Common_五杀.mp3", "Common_全军出击.mp3", "Common_双杀.mp3", "Common_啦啦啦德玛西亚1.mp3", "Common_啦啦啦德玛西亚2.mp3", "Common_啦啦啦德玛西亚3.mp3", "Common_四杀.mp3", "Common_团灭.mp3", "Common_多杀合音.mp3", "Common_大杀特杀(三连杀).mp3", "Common_失败.mp3", "Common_排位赛背景音乐.mp3", "Common_接近神(七连杀).mp3", "Common_敌军还有30秒到达战场.mp3", "Common_无人能挡(五连杀).mp3", "Common_暴走(四连杀).mp3", "Common_欢迎来到英雄联盟.mp3", "Common_终结击杀.mp3", "Common_胜利.mp3", "Common_超神(八连杀及以上).mp3", "Common_选择英雄音乐.mp3"
]英雄配音
http://box.dwstatic.com/sounds/Ashe/Ashe_你要来几发吗.mp3?&v=61&OSType=iOS7.0.4&versionName=2.1.1其他配音
http://box.dwstatic.com/sounds/Common/Common_一血.mp3?&v=61&OSType=iOS7.0.4&versionName=2.1.1</span>

因为下载后图标就变成播放了,于是需要在加载TableView时先判断配音是否存在,若存在,则显示播放按钮,若不存在,则显示下载按钮。

#pragma mark设置tableView每行内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{<span style="white-space:pre">    </span>UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"heroDetail"];
<span style="white-space:pre"> </span>NSString *voiceStr = [self.commonVoiceList objectAtIndex:indexPath.row];if (indexPath.row > 0){//字符串查找并替换 找到self.enName_的字符串,替换为空voiceStr = [voiceStr stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@_",self.enName] withString:@""];}voiceStr = [voiceStr stringByReplacingOccurrencesOfString:@"Common_" withString:@""];voiceStr = [voiceStr stringByReplacingOccurrencesOfString:@".mp3" withString:@""];UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 15, 275, 16)];label.text = voiceStr;label.font = [UIFont systemFontOfSize:13];[cell.contentView addSubview:label];NSFileManager *fileManager = [NSFileManager defaultManager];NSString *fileName = [self.commonVoiceList objectAtIndex:indexPath.row];NSString *pathName = self.enName;//文件路径字符串拼接,拼接后自动添加"/"NSString *filePath = [DocumentsDirectory stringByAppendingPathComponent:pathName];NSString *file     = [filePath stringByAppendingPathComponent:fileName];if ([fileManager fileExistsAtPath:file]){UIButton *playBtn = [[UIButton alloc] initWithFrame:CGRectMake(295, 15, 15, 15)];[playBtn setImage:[UIImage imageNamed:@"icon_game_video"] forState:UIControlStateNormal];[playBtn addTarget:self action:@selector(playVoice:) forControlEvents:UIControlEventTouchUpInside];playBtn.tag = indexPath.row;[cell.contentView addSubview:playBtn];}else{UIButton *downloadBtn = [[UIButton alloc] initWithFrame:CGRectMake(295, 15, 15, 15)];[downloadBtn setImage:[UIImage imageNamed:@"icon_download"] forState:UIControlStateNormal];[downloadBtn addTarget:self action:@selector(downloadVoice:) forControlEvents:UIControlEventTouchUpInside];downloadBtn.tag = indexPath.row;[cell.contentView addSubview:downloadBtn];}}return cell;
}</span>

播放音频引入了第三方框架“AudioPlayer”“AudioStreamer”(改成自动释放)

代码如下:

#pragma mark播放音频
- (void)playVoice:(UIButton *)sender
{NSLog(@"play~");NSString *fileName = [self.commonVoiceList objectAtIndex:sender.tag];NSString *pathName = self.enName;NSString *filePath = [DocumentsDirectory stringByAppendingPathComponent:pathName];NSString *file     = [filePath stringByAppendingPathComponent:fileName];AudioPlayer *play = [AudioPlayer sharePlayer];[play playWithDataSourceType:DataSourceTypeLocal withURLString:file];}


【LOL盒子】英雄详情-配音-【下载】与【播放】模块相关推荐

  1. iOS视频边下载边播放

    随着视频行业的发展,很多用户对于观看体验也有了更高的要求,以前的习惯是下载好了在观看,而现在是希望1分钟都不要等,ZUI好一边看着一边下载,等把这个视频看完也下载完了,也就是我们常说的"视频 ...

  2. 成功解决android 网络视频边下载变播放。

    关于android网络视频在线播放也困扰着很多新手们,在网络上找了很久都没有找到合适解决方案. 在网上找到了边下载边播放功能,根本不成功,要么是有bug,要么是无法播放,有些是下载完了才可以播放.达不 ...

  3. 2012年度最佳分享:仿webQQ界面,详情请下载,不吃亏

    原文:2012年度最佳分享:仿webQQ界面,详情请下载,不吃亏 源代码下载地址:http://www.zuidaima.com/share/1550463288052736.htm 2012年度最佳 ...

  4. 微信语音(录音,上传,下载,播放,停止)

    1.api:微信:JSSDK    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 (1)初始化微信:一般在 ...

  5. iOS音视频实现边下载边播放

    iOS音视频实现边下载边播放 近段时间制作视频播放社区的功能,期间查找了不少资料,做过很多尝试,现在来整理一下其中遇到的一些坑.由于考虑到AVPlayer对视频有更高自由度的控制,而且能够使用它自定义 ...

  6. 怎么实现边下载边播放

    一种方法是在服务器端做调整,即将带有编码信息的头放在开始,另外一种就是先下载这个编码头. mp4文档比较复杂,我用简单的方式描述一下,mp4是很多box的嵌套,最上层box包括ftyp,free,mo ...

  7. Downcast for Mac 2.11.1下载、播放和同步您的播客。

    Downcast for Mac - 麦金塔 macnp.com Downcast让您可以通过专为播客构建的直观界面下载.播放和同步**您喜爱的播客. 订阅功能 搜索.订阅和下载音频和视频播客 通过 ...

  8. 边下载边播放的播放器Android边下边播

    看到很多朋友有提问到Android边下载边播放的播放器,小编在这里给大家做个关于这方面的分享. 首先作为一款播放器,支持转码或者支持各种视频格式是必须的,比如常见的视频格式:MP4/FLV/M3U8/ ...

  9. 实现MP4文件边下载边播放

    最近遇到的需求,在老系统中有部分MP4视频在播放时需要完全加载完才能播放,使得用户体验很差(现在都是边下载边播放模式),造成这种情况的原因是用来描述MP4文件的moov atom元数据被放在MP4文件 ...

最新文章

  1. zk和eureka的区别
  2. CentOS_6.5配置iptables防火墙策略
  3. 产品经理如何开始数据分析之路?(基础知识)
  4. C# 关闭进程的时候总是捕捉到System.Threading.ThreadAbortException: 正在中止线程
  5. Namespace declaration statement has to be the very first statement in the script
  6. django oracle 性能,4.利用Django在前端展示Oracle 状态趋势
  7. 缓冲区,粘包,解决粘包的方法,
  8. nullnullicon 小图标
  9. c语言函数返回数组_C语言如何用一维数组拷贝函数,拷贝二位数组(C Primer Plus 10-7)...
  10. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建
  11. 制作芭奇站群软件自定义发布接口命令大全
  12. redis作为消息队列的原理
  13. int 10h中断例程
  14. SQLServer获取2020年节假日列表(可用于Java、.NET,Python,C++等实现)
  15. JavaSe之多线程
  16. 一位工作8年程序员的成长感悟,值得深思
  17. Ubuntu 17.10 中文无忧版
  18. 从运营商角度来考虑为什么NAT不能搭建服务器?
  19. 计算机应用基础第二版中职教案,中职计算机应用基础教案.doc
  20. 学习日记|JavaScript在网页实现的五子棋游戏

热门文章

  1. 《kafka问答100例 -2》 创建Topic的时候 什么时候在Broker磁盘上创建的日志文件
  2. L1-035 情人节(java)
  3. gulp-uglify(压缩js)
  4. 如何让eclipse ADT 模拟器显示虚拟键盘
  5. 第十三篇 VUE中使用头像插件 multiavatar,超级有趣的头像生成插件,提升开发的乐趣
  6. 哪个牌子台灯对孩子视力好?精选不同价位的学生护眼台灯
  7. Socket网络编程基本数据流图
  8. Arthas基础使用篇
  9. SharedPreferences获取时报空指针异常,以及普通类中使用SharedPreferences存储数据
  10. ubuntu 12.04 安装深度影音播放器(deepin-music-player)+百度音乐插件