麦克风PCM数据实时编码MP3数据的方法

来源:互联网 发布:企业级 选课系统 源码 编辑:程序博客网 时间:2024/05/22 05:11
最后还是再StackOverFlow上找到的解决办法,StackOverFlow,大赞!!

从麦克风获取PCM数据的方法,参看Apple的官方例子:SpeakHere

注意,以下方法实现的前提是:
录音格式为kAudioFormatLinearPCM;
录音格式的mBitsPerChannel要设置为16

SpeakHere的InputBufferHandler回调方法中,可以获取到PCM数据:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// AudioQueue callback function, called when an input buffers has been filled.
voidAudioInputBufferHandler( void*                               inUserData,
                              AudioQueueRef                        inAQ,
                              AudioQueueBufferRef                  inBuffer,
                              constAudioTimeStamp *               inStartTime,
                              UInt32                               inNumPackets,
                              constAudioStreamPacketDescription * inPacketDesc ) {
     
    AudioRecorder *recorder = (AudioRecorder *)inUserData;
    try{
         
        if( recorder.isRunning && inNumPackets > 0 ) {
 
            [recorder.mp3Encoder encodePcmData:inBuffer->mAudioData withDataSize:inNumPackets];
            // write packets to file
            /*
            XThrowIfError( AudioFileWritePackets( aqr->mRecordFile,
                                                  FALSE,
                                                  inBuffer->mAudioDataByteSize,
                                                  inPacketDesc,
                                                  aqr->mRecordPacket,
                                                  &inNumPackets,
                                                  inBuffer->mAudioData ),
                           "AudioFileWritePackets failed!");
            aqr->mRecordPacket += inNumPackets;
            */
        }
         
        // if we're not stopping, re-enqueue the buffe so that it gets filled again
        if( recorder.isRunning ) {
             
            XThrowIfError( AudioQueueEnqueueBuffer( inAQ, inBuffer, 0, NULL), @"AudioQueueEnqueueBuffer failed!" );
        }
    }
    catch( NSException*e ) {
 
        [Dialog simpleToast:[NSStringstringWithFormat:@"Error: %@ (%@)\n", [e name], [e reason]]];
        // DLog(@"Error: %@ (%@)\n", [e name], [e reason]);
    }
}


通过[recorder.mp3Encoder encodePcmData:inBuffer->mAudioData withDataSize:inNumPackets];
把PCM数据扔给MP3编码器

?
1
2
3
4
5
6
7
8
9
10
11
- (void)encodePcmData:(void*)pcmBuffer withDataSize:(UInt32)pcmDataSize {
 
        intmp3DataSize = pcmDataSize * 4;
         
        unsignedcharmp3Buffer[mp3DataSize];
         
        intencodedBytes = lame_encode_buffer( lame, pcmBuffer, pcmBuffer, pcmDataSize, mp3Buffer, mp3DataSize );
        //lame_encode_buffer_interleaved( lame, pcmBuffer, PCM_DATA_SIZE, mp3Buffer, MP3_DATA_SIZE );
         
        NSData*mp3Data = [NSDatadataWithBytes:&mp3Buffer length:encodedBytes];
}



之前在BaiDu上搜了一些文章,都是把PCM文件转成MP3文件的,所用的方法是lame_encode_buffer_interleaved
而且传递数据长度的参数,用的是inBuffer->mAudioDataByteSize
也许转换文件用这个方法可以,也有可能是PCM的格式问题,用这个方法编码出来的数据,有问题,爆音,而且,声音断断续续

在StackOverFlow上找到的方法,用的数据长度参数是inNumPackets,编码方法是lame_encode_buffer
结果大不相同!

我为人人,人人为我!
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 代办用虚假地址注册的公司怎么办? 写字楼注册公司租户不租了怎么办 租户没把公司迁出我该怎么办 租户不肯把户口迁出了业主怎么办 同片区个体户营业场所搬迁怎么办 个体领发票的本丢了怎么办 领房产证发票和合同丢了怎么办 税务登记证5年没有办怎么办 二证合一后税务登记证怎么办? 微信漂流瓶打招呼对方收不到怎么办 添加不上徽信好友的微信帐号怎么办 手机号码不用了微信密码忘了怎么办 别人用我的手机号码注册微信怎么办 电脑此网站的安全证书有问题怎么办 起诉离婚开庭时被告不到场怎么办 商标35类被别人注册了怎么办 商标被注销后被别人注册怎么办 电商35类商标被抢注怎么办 血小板太低怎么办可以吃水果吗? 微信好友删除了只记得昵称怎么办 优酷会员1080p很卡怎么办 电脑最下面的任务栏不显示怎么办 ea账号保留的问题忘了怎么办 微博超级话题账号被屏蔽怎么办 梦幻西游手机将军令号码换了怎么办 文档的内容被锁定无法修改怎么办 用户没有权限访问u盘时该怎么办? 电脑找不到ip地址连不上网怎么办 商标提前被别人注册微博昵称怎么办 扫码注册显示手机号被占用怎么办 vivo手机屏锁密码忘了怎么办 手机号注册微博手机号不用了怎么办 微博更换手机号被别人注册过怎么办 怎么有个qq注册验证码怎么办 12306手机丢了密码忘了怎么办 教师考试注册时邮箱填写错误怎么办 计算机二级注册时邮箱填错了怎么办 注册时执业范围填错了怎么办 百度号被盗了申诉不回来怎么办 斗鱼直播伴侣显示分类不可用怎么办 斗鱼黑名单显示网络加载失败怎么办