zoukankan      html  css  js  c++  java
  • ios CAF音频转换为MP3

    Url:http://blog.csdn.net/ysy441088327/article/details/7392842#reply

     为了达到 iPhone 与 Android 实现音频互通. 那么Mp3格式的音频文件再好不过了.

    至于能够转换成Amr 是最好,10秒 的 一个Amr文件 只有5K左右的大小. 非常适合移动设备的数据传输

    这里主要用到lame,一款非常棒的Mp3音频编码器.   

    那么在转换之前呢? 就需要先录制好音频文件,使用 AVAudioRecorder 进行音频录制之前,进行如下参数设置:

    - (void)initialRecord
    
    {
    
        //录音权限设置,IOS7必须设置,得到AVAudioSession单例对象
    
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    
        //设置类别,此处只支持支持录音
    
        [audioSession setCategory:AVAudioSessionCategoryRecord error:nil];
    
        //启动音频会话管理,此时会阻断后台音乐的播放
    
        [audioSession setActive:YES error:nil];
    
        //录音参数设置设置
    
        NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
    
        //设置录音格式  AVFormatIDKey==kAudioFormatLinearPCM
    
    //    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    
        //caf的录制格式
    
       [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
    
        
    
        //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)//acc的采样频率
    
    //    [recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
    
        
    
        [recordSetting setValue:[NSNumber numberWithFloat:11025.0] forKey:AVSampleRateKey];
    
        //录音通道数  1 或 2 在录制caf文件时,需要使用双通道,否则在转换为MP3格式时,声音不对
    
        [recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    
        //线性采样位数  8、16、24、32
    
        [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    
        //录音的质量
    
    //    [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
    
        [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
    
        
    
        //录音文件保存的URL
    
        CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    
        NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    
        NSString * filename = [NSString stringWithFormat:@"%@.caf",cfuuidString];
    
        NSString *audioRecordFilePath = AUDIORECORDFILEPATH(filename);
    
        lastaudioRecordFilePath = audioRecordFilePath;
    
        
    
        //判断目录是否存在不存在则创建
    
        NSString *audioRecordDirectories = [audioRecordFilePath stringByDeletingLastPathComponent];
    
        NSFileManager *fileManager=[NSFileManager defaultManager];
    
        if (![fileManager fileExistsAtPath:audioRecordDirectories]) {
    
            [fileManager createDirectoryAtPath:audioRecordDirectories withIntermediateDirectories:YES attributes:nil error:nil];
    
        }
    
        NSURL *url = [NSURL fileURLWithPath:audioRecordFilePath];
    
        NSError *error=nil;
    
        //初始化AVAudioRecorder
    
        _recorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];
    
        if (error != nil) {
    
            //NSLog(@"初始化录音Error: %@",error);
    
        }else{
    
            if ([_recorder prepareToRecord]) {
    
                //录音最长时间
    
                [_recorder recordForDuration:self.recorderDuration-1];
    
                _recorder.delegate=self;
    
                [_recorder record];
    
                
    
                //开启音量检测
    
                _recorder.meteringEnabled = YES;
    
                //开启定时器,音量监测
    
                _timer=[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(volumeMeters:) userInfo:nil repeats:YES];
    
            }
    
        }
    
    }
    

       

    通过上面的参数所录制的音频文件体积非常大,不过不要担心,这只是第一步,只要成功转换成Mp3以后,可以保证文件体积每秒在4K左右.^^

    另外一点,除非你时间多,那么没必要去尝试设置其他种类的参数再用来转换,因为作者我就试了不少,反正只有上面的参数才能保证,音质的完整和流畅.

    下面介绍 lame 静态库 使用流程 主要有两个核心文件,使用很简单:

    需要加入 lame.h

    #include "lame.h"  

     

    //转编码为 mp3
    - (void)audio_PCMtoMP3:(NSString *)cafFilePath andMP3FilePath:(NSString *)mp3FilePath
    {
        NSFileManager* fileManager=[NSFileManager defaultManager];
        if([fileManager removeItemAtPath:mp3FilePath error:nil]) {
            NSLog(@"删除");
        }
        
        @try {
            int read, write;
            
            FILE *pcm = fopen([cafFilePath cStringUsingEncoding:1], "rb");  //source 被转换的音频文件位置
    
            if(pcm == NULL) {
                NSLog(@"file not found");
            } else {
                fseek(pcm, 4*1024, SEEK_CUR);                                   //skip file header
                FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb");  //output 输出生成的Mp3文件位置
                
                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, 11025.0);
                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) {
            NSLog(@"%@",[exception description]);
        }
        @finally {
            NSLog(@"MP3生成成功");
        }
    }
    

      lamp下载区   密码: 3gy2

  • 相关阅读:
    解决VTune错误.../lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ...)
    【环境配置】配置sdk
    Eclipse设置Android Logcat输出字体大小
    Vertica数据库操作
    hihoCoder#1038 : 01背包
    初识Dubbo 系列之4-Dubbo 依赖
    计算机相关专业的同学该怎么用自己的计算机
    十天学习PHP之第三天
    Android之Fragment的优点和作用
    Fragment的生命周期
  • 原文地址:https://www.cnblogs.com/nonato/p/4381523.html
Copyright © 2011-2022 走看看