麦克风PCM数据实时编码MP3数据的方法
来源:互联网 发布:企业级 选课系统 源码 编辑:程序博客网 时间:2024/05/22 05:11
最后还是再StackOverFlow上找到的解决办法,StackOverFlow,大赞!!
从麦克风获取PCM数据的方法,参看Apple的官方例子:SpeakHere
注意,以下方法实现的前提是:
录音格式为kAudioFormatLinearPCM;
录音格式的mBitsPerChannel要设置为16
SpeakHere的InputBufferHandler回调方法中,可以获取到PCM数据:
通过[recorder.mp3Encoder encodePcmData:inBuffer->mAudioData withDataSize:inNumPackets];
把PCM数据扔给MP3编码器
之前在BaiDu上搜了一些文章,都是把PCM文件转成MP3文件的,所用的方法是lame_encode_buffer_interleaved
而且传递数据长度的参数,用的是inBuffer->mAudioDataByteSize
也许转换文件用这个方法可以,也有可能是PCM的格式问题,用这个方法编码出来的数据,有问题,爆音,而且,声音断断续续
在StackOverFlow上找到的方法,用的数据长度参数是inNumPackets,编码方法是lame_encode_buffer
结果大不相同!
我为人人,人人为我!
从麦克风获取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.
void
AudioInputBufferHandler(
void
* inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const
AudioTimeStamp * inStartTime,
UInt32 inNumPackets,
const
AudioStreamPacketDescription * 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:[
NSString
stringWithFormat:@
"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 {
int
mp3DataSize = pcmDataSize * 4;
unsigned
char
mp3Buffer[mp3DataSize];
int
encodedBytes = lame_encode_buffer( lame, pcmBuffer, pcmBuffer, pcmDataSize, mp3Buffer, mp3DataSize );
//lame_encode_buffer_interleaved( lame, pcmBuffer, PCM_DATA_SIZE, mp3Buffer, MP3_DATA_SIZE );
NSData
*mp3Data = [
NSData
dataWithBytes:&mp3Buffer length:encodedBytes];
}
之前在BaiDu上搜了一些文章,都是把PCM文件转成MP3文件的,所用的方法是lame_encode_buffer_interleaved
而且传递数据长度的参数,用的是inBuffer->mAudioDataByteSize
也许转换文件用这个方法可以,也有可能是PCM的格式问题,用这个方法编码出来的数据,有问题,爆音,而且,声音断断续续
在StackOverFlow上找到的方法,用的数据长度参数是inNumPackets,编码方法是lame_encode_buffer
结果大不相同!
我为人人,人人为我!
阅读全文
0 0
- 麦克风PCM数据实时编码MP3数据的方法
- android 实时PCM数据编码成AAC
- directsound抓取麦克风PCM数据封装类
- DirectSound抓取麦克风PCM数据封装类
- directsound抓取麦克风PCM数据封装类
- directsound抓取麦克风PCM数据封装类
- android 实时PCM数据编码成AAC【转】
- ios实时播放PCM数据
- PCM 模拟数据向数字数据编码方法过程
- PCM 模拟数据向数字数据编码方法过程
- Pcm/Mp3编码
- faac库编码PCM数据
- PCM编码后的音频数据存放格式说明
- [FFMPEG-1]最想实现的第一个功能-从mp3中提取pcm数据
- PCM音频采样数据编码为AAC的压缩编码数据
- [FFMPEG-4]重构从mp3中获取pcm数据
- mp3转aac,用AVAudioFifo缓冲pcm数据
- FFmepg 音频编码(PCM数据编码成AAC android)
- BZOJ 1053反素数ant
- Hbase安装出现的错误
- 微信二维码支付native原生支付开发模式二
- Verilog实现千兆以太网传输
- 使用注释标签来隐藏浏览器不支持的脚本
- 麦克风PCM数据实时编码MP3数据的方法
- 解决跨域,session不一致问题
- figaro
- linux驱动初识PCI驱动(二)
- eclipse 常用快捷键
- laravel5.4 项目 模块化 利用caffeinated/modules
- 【SignalR学习系列】3. SignalR实时高刷新率程序
- Noip2012 Day1 T2 国王游戏(贪心+高精度)
- 路由表以及路由选择算法