博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCM转MP3工具的封装
阅读量:4337 次
发布时间:2019-06-07

本文共 4652 字,大约阅读时间需要 15 分钟。

PCM转MP3工具的封装

 

说明

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

2. 使用  生成支持64位的 lame 库.

 

源码

中的 

////  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 
@class PcmToMp3Manager;@protocol PcmToMp3ManagerDelegate
@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
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 
@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(0, 0), ^{ @try { int read, write; FILE *pcm = fopen([self.pcmFilePath cStringUsingEncoding:1], "rb"); //source fseek(pcm, 4*1024, SEEK_CUR); //skip file header FILE *mp3 = fopen([self.mp3FilePath cStringUsingEncoding:1], "wb"); //output 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_in_samplerate(lame, 44100); lame_set_VBR(lame, vbr_default); 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) { 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 即可

 

转载于:https://www.cnblogs.com/YouXianMing/p/5714914.html

你可能感兴趣的文章
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_01.Spring框架简介_03.spring概述
查看>>
阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合
查看>>
阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
查看>>
阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
查看>>
阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>