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. python学习之算法、自定义模块、系统标准模块(上)

    算法.自定义模块.系统标准模块(time .datetime .random .OS .sys .hashlib .json和pickle) 一:算法回顾: 冒泡算法,也叫冒泡排序,其特点如下: 1. ...

  2. C#用Oracle.DataAccess中连接Oracle要注意版本问题!

    客户端Oracle.DataAccess.dll与服务器版本不一致时,如下修改:1.在客户端Web.config中,增加如下配置:<runtime> <assemblyBinding ...

  3. mysql 日期操作 增减天数、时间转换、时间戳(转换)

    http://hi.baidu.com/juntao_li/item/094d78c6ce1aa060f6c95d0b MySQL datediff(date1,date2):两个日期相减 date1 ...

  4. bzoj 1188

    博弈的题目做的还是太少啦... 不会写啊啊啊 思路:将每个石子看成一个游戏, 那么整个游戏sg值就是全部石子sg值的异或. #include<bits/stdc++.h> #define ...

  5. 036 SQLContext和HiveContext

    1.SqlContext SQLContext依赖SparkContext 功能:支持SparkSQL操作(不依赖Hive) SQLContext在一个JVM中默认允许存在多个 只有SQLContex ...

  6. 反射调用 java bean的set和get方法

    一.使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.Proper ...

  7. collectionView代理方法快速设置cell大小上下左右间隔

    #define JianGe 25 #define GeShu 4 #define ScreenWidth ([UIScreen mainScreen].bounds.size.width) #def ...

  8. Nmap扫描教程之Nmap基础知识

    Nmap扫描教程之Nmap基础知识 Nmap扫描Nmap基础知识 Nmap是一个免费开放的网络扫描和嗅探工具包,也叫网络映射器(Network Mapper).Nmap工具可以用来扫描电脑上开放的端口 ...

  9. [HDU4348]To the moon(主席树+标记永久化)

    学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...

  10. CS1.6找金钱和人物血量

    一.查找金钱数量 先搜索800 然后购买东西,再搜索剩下的钱 然后发现有两个地址,一个绿色的地址(也就是静态地址),还有一个动态地址 经过测试后,静态地址的值是对应屏幕上的值,而真正实际的金钱是那个动 ...