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

  • 相关阅读:
    HTML学习笔记
    "IIS无法启动"问题解决方法
    NET访问MySQl数据库中文乱码解决
    珍爱生命,远离肥胖,远离过劳死
    Bcp 命令注意事项
    阿里云万郁香:多样付费选择构筑成本最优的弹性体验
    性能提升40%!阿里云神龙大数据加速引擎获TPCxBB世界排名第一
    阿里云王志坤:强劲可靠、无处不在的云,为创新保驾护航
    发现新视界——视觉计算将如何改变生产方式
    Soul运维总监尤首智:企业如何从0到1建设云上运维体系
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5714914.html
Copyright © 2020-2023  润新知