PCM转MP3工具的封装

说明

1. 对 PCM 转 MP3 进行了简单的封装.

2. 使用 https://github.com/wuqiong/mp3lame-for-iOS 生成支持64位的 lame 库.

源码

https://github.com/YouXianMing/iOS-General-Tools 中的 PCM-to-MP3

//
// PcmToMp3Manager.h
// RecordMusic
//
// Created by YouXianMing on 16/7/28.
// Copyright © 2016年 YouXianMing. All rights reserved.
//
// Lame-for-iOS https://github.com/wuqiong/mp3lame-for-iOS
// #import <Foundation/Foundation.h>
@class PcmToMp3Manager; @protocol PcmToMp3ManagerDelegate <NSObject> @optional /**
* Did convert the pcm to mp3.
*
* @param manager The PcmToMp3Manager object.
* @param sucess Sucess or not.
* @param errorInfo Error info.
*/
- (void)didConvertPcmToMp3:(PcmToMp3Manager *)manager sucess:(BOOL)sucess errorInfo:(NSString *)errorInfo; @end /**
* In "Build Phases", You can add '-Wno-shorten-64-to-32' to the file 'PcmToMp3Manager.m' to ignore the warning.
*/
@interface PcmToMp3Manager : NSObject /**
* The PcmToMp3Manager's delegate.
*/
@property (nonatomic, weak) id <PcmToMp3ManagerDelegate> delegate; /**
* The pcm file's path.
*/
@property (nonatomic, strong) NSString *pcmFilePath; /**
* The mp3 file's path you specified.
*/
@property (nonatomic, strong) NSString *mp3FilePath; /**
* Before you start convert, you should specified the pcm file's path.
*/
- (void)startConvert; @end
//
// PcmToMp3Manager.m
// RecordMusic
//
// Created by YouXianMing on 16/7/28.
// Copyright © 2016年 YouXianMing. All rights reserved.
// #import "PcmToMp3Manager.h"
#import <lame/lame.h> @implementation PcmToMp3Manager - (void)startConvert { NSParameterAssert(self.pcmFilePath); BOOL isDirectory = NO;
BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:self.pcmFilePath isDirectory:&isDirectory]; if (isExist && isDirectory == NO) { dispatch_async(dispatch_get_global_queue(, ), ^{ @try { int read, write; FILE *pcm = fopen([self.pcmFilePath cStringUsingEncoding:], "rb"); //source
fseek(pcm, *, SEEK_CUR); //skip file header
FILE *mp3 = fopen([self.mp3FilePath cStringUsingEncoding:], "wb"); //output const int PCM_SIZE = ;
const int MP3_SIZE = ;
short int pcm_buffer[PCM_SIZE * ];
unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init();
lame_set_in_samplerate(lame, );
lame_set_VBR(lame, vbr_default);
lame_init_params(lame); do {
read = fread(pcm_buffer, * sizeof(short int), PCM_SIZE, pcm); if (read == ) { 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, , mp3); } while (read != ); lame_close(lame);
fclose(mp3);
fclose(pcm); } @catch (NSException *exception) { if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate didConvertPcmToMp3:self sucess:NO errorInfo:exception.description];
});
} } @finally { if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate didConvertPcmToMp3:self sucess:YES errorInfo:nil];
});
}
}
}); } else { if (self.delegate && [self.delegate respondsToSelector:@selector(didConvertPcmToMp3:sucess:errorInfo:)]) { dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate didConvertPcmToMp3:self sucess:NO errorInfo:[NSString stringWithFormat:@"'%@' not exist.", self.pcmFilePath]];
});
}
}
} @end

细节

为了去除 PcmToMp3Manager 的 warning, 在文件 PcmToMp3Manager.m 添加 -Wno-shorten-64-to-32 即可

PCM转MP3工具的封装的更多相关文章

  1. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  2. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  3. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  4. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  5. JSON 解析工具的封装(Java)

    JSON 解析工具的封装(Java) 一直想有一个属于自己的JSON工具,今天终于弄好了..... 1.添加pom依赖包 <!--json解析--> <dependency> ...

  6. 酷狗歌曲缓存kgtemp转mp3工具

    一直用网易音乐听歌,不过网易的歌曲版权确实是少了一些,在酷狗上可以找到,但收费歌曲只能试听不能下载. 寻找方案 从设置里可以看出,酷狗会设置缓存目录,试听的歌曲存放到这个缓存里. 打开缓存目录: 可以 ...

  7. 开源小工具 酷狗、网易音乐缓存文件转mp3工具

    发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件. 以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云 ...

  8. kgtemp文件转mp3工具

    kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名. kgtemp解密 kgtemp文件前1024个字节是固定的包头信息,解密方案详细 ...

  9. (转载) 百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 百度地图工具类封装(包括定位,附近.城市.范围poi检索, ...

随机推荐

  1. wpf 查找children的方法

    var newValue = (bool)args.NewValue; HZWaitLoadingEx source = (HZWaitLoadingEx)sender; ControlTemplat ...

  2. 在c#中过滤通过System.IO.Directory.GetDirectories 方法获取的是所有的子目录和文件中的系统隐藏的文件(夹)的方法

    //读取目录 下的所有非隐藏文件夹或文件 public List<FileItem> GetList(string path) { int i; string[] folders = Di ...

  3. .NetCore中使用ExceptionLess 添加操作日志

    上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...

  4. 一步一步学习IdentityServer3 (3)

    在上一篇中配置一个基础的idrserver服务端 这篇文章将对服务端做一些变化,这里我先贴一下上一章中的代码 证书: static class Certificate { public static ...

  5. T-SQL语句3

    一.删除表 1.drop table语句 drop table database_name,schema_name,table_name 2.删除数据表 drop table dbo.t_delete ...

  6. Caffe训练AlexNet网络模型——问题三

    caffe 进行自己的imageNet训练分类:loss一直是87.3365,accuracy一直是0 解决方法: http://blog.csdn.net/jkfdqjjy/article/deta ...

  7. C语言中对数组名取地址

    在C/C++中,数组名相当于一个指针,指向数组的首地址.这里“相当于”不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一 ...

  8. Top 10 Revit Architecture 2014 books

    Revit Architecture, along with ArchiCAD, is most used BIM software in architectural design. Although ...

  9. 将NX模型导入Process Designer的方法

    如何把一个有焊点的零件从nx中输入到process designer 中?   用户在NX中做了一个prt文件, 想把它输入到process designer中, 并且包括焊点信息, 该如何做? 解决 ...

  10. android 进程间通信 messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯? android 消息机制 进程间 android 进程间 可以用 handler么 messenger 与 handler 机制 messenger 机制 是不是 就是 handler 机制 或 , 是不是就是 消息机制 android messenge

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha messenger 是什么 binder 跟 aidl 区别 intent 进程间 通讯 ...