PCM转MP3工具的封装

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(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 即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、Java实现wav音频文件换为pcm音频文件(AudioUtils.java) 2、Java实现播放pcm音频文件(PCMPlay.java) WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。 PCM:PCM(Pulse Code Modulation----脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。 简单来说:wav是一种无损的音频文件格式,pcm是没有压缩的编码方式。 WAV和PCM的关系 WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互换之中,例如MP3换成WMA。 简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值