11
22
33#import " AWAACEncoder.h"
4-
54@interface AWAACEncoder ()
65@property (nonatomic ) AudioConverterRef audioConverter;
76@property (nonatomic ) uint8_t *aacBuffer;
@@ -39,15 +38,14 @@ - (id) init {
3938 */
4039- (void ) setupEncoderFromSampleBuffer : (CMSampleBufferRef)sampleBuffer {
4140 AudioStreamBasicDescription inAudioStreamBasicDescription = *CMAudioFormatDescriptionGetStreamBasicDescription ((CMAudioFormatDescriptionRef)CMSampleBufferGetFormatDescription (sampleBuffer));
42- NSLog (@" pcm---samplerate-->%f , channel-->%d " ,inAudioStreamBasicDescription.mSampleRate , inAudioStreamBasicDescription.mChannelsPerFrame );
4341
44- AudioStreamBasicDescription outAudioStreamBasicDescription = {0 };
45- outAudioStreamBasicDescription.mSampleRate = _sample_rate;
46- outAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC ;
47- outAudioStreamBasicDescription.mFormatFlags = kMPEG4Object_AAC_LC ;
48- outAudioStreamBasicDescription.mBytesPerPacket = 0 ;
49- outAudioStreamBasicDescription.mFramesPerPacket = 1024 ;
50- outAudioStreamBasicDescription.mBytesPerFrame = 0 ;
42+ AudioStreamBasicDescription outAudioStreamBasicDescription = {0 }; // 初始化输出流的结构体描述为0. 很重要。
43+ outAudioStreamBasicDescription.mSampleRate = self. sample_rate ; // inAudioStreamBasicDescription.mSampleRate; // 音频流,在正常播放情况下的帧率。如果是压缩的格式,这个属性表示解压缩后的帧率。帧率不能为0。
44+ outAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC ; // 设置编码格式
45+ outAudioStreamBasicDescription.mFormatFlags = kMPEG4Object_AAC_LC ; // 无损编码 ,0表示没有
46+ outAudioStreamBasicDescription.mBytesPerPacket = 0 ; // 每一个packet的音频数据大小。如果的动态大小,设置为0。动态大小的格式,需要用AudioStreamPacketDescription 来确定每个packet的大小。
47+ outAudioStreamBasicDescription.mFramesPerPacket = 1024 ; // 每个packet的帧数。如果是未压缩的音频数据,值是1。动态码率格式,这个值是一个较大的固定数字,比如说AAC的1024。如果是动态大小帧数(比如Ogg格式)设置为0。
48+ outAudioStreamBasicDescription.mBytesPerFrame = 0 ; // 每帧的大小。每一帧的起始点到下一帧的起始点。如果是压缩格式,设置为0 。
5149 outAudioStreamBasicDescription.mChannelsPerFrame = 1 ; // 声道数
5250 outAudioStreamBasicDescription.mBitsPerChannel = 0 ; // 压缩格式设置为0
5351 outAudioStreamBasicDescription.mReserved = 0 ; // 8字节对齐,填0.
@@ -68,7 +66,9 @@ - (void) setupEncoderFromSampleBuffer:(CMSampleBufferRef)sampleBuffer {
6866 编解码器(codec)指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将 信号或者数据流进行编码(通常是为了传输、存储或者加密)或者提取得到一个编码流的操作,也包括为了观察或者处理从这个编码流中恢复适合观察或操作的形式的操作。编解码器经常用在视频会议和流媒体等应用中。
6967 * @return 指定编码器
7068 */
71- - (AudioClassDescription *)getAudioClassDescriptionWithType : (UInt32)type fromManufacturer : (UInt32)manufacturer {
69+ - (AudioClassDescription *)getAudioClassDescriptionWithType : (UInt32)type
70+ fromManufacturer : (UInt32)manufacturer
71+ {
7272 static AudioClassDescription desc;
7373
7474 UInt32 encoderSpecifier = type;
@@ -117,14 +117,14 @@ OSStatus inInputDataProc(AudioConverterRef inAudioConverter, UInt32 *ioNumberDat
117117 AWAACEncoder *encoder = (__bridge AWAACEncoder *)(inUserData);
118118 UInt32 requestedPackets = *ioNumberDataPackets;
119119
120+ // *ioNumberDataPackets = (int)encoder.pcmBufferSize/2;
120121 size_t copiedSamples = [encoder copyPCMSamplesIntoBuffer: ioData];
121122 if (copiedSamples < requestedPackets) {
122123 // PCM 缓冲区还没满
123124 *ioNumberDataPackets = 0 ;
124125 return -1 ;
125126 }
126127 *ioNumberDataPackets = 1 ;
127-
128128 return noErr;
129129}
130130
@@ -176,6 +176,7 @@ - (void) encodeSampleBuffer:(CMSampleBufferRef)sampleBuffer completionBlock:(voi
176176 NSMutableData *fullData = [NSMutableData dataWithData: adtsHeader];
177177 [fullData appendData: rawAAC];
178178 data = fullData;
179+ // data = rawAAC;
179180 } else {
180181 error = [NSError errorWithDomain: NSOSStatusErrorDomain code: status userInfo: nil ];
181182 }
@@ -189,21 +190,23 @@ - (void) encodeSampleBuffer:(CMSampleBufferRef)sampleBuffer completionBlock:(voi
189190 });
190191}
191192
193+
194+
195+ #pragma mark - HEADER
192196- (NSData *) adtsDataForPacketLength : (NSUInteger )packetLength {
193197 int adtsLength = 7 ;
194198 char *packet = malloc (sizeof (char ) * adtsLength);
195199 // Variables Recycled by addADTStoPacket
196200 int profile = 2 ; // AAC LC
197201 // 39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
198202 int freqIdx = 4 ; // 44.1KHz
199- // if (_sample_rate == 44100) {
200- // freqIdx = 4;
201- // }else if (_sample_rate == 16000) {
202- // freqIdx = 8;
203- // }else if (_sample_rate == 8000) {
204- // freqIdx = 11;
205- // }
206- // int freqIdx = 11; //44.1KHz
203+ if (_sample_rate == 44100 ) {
204+ freqIdx = 4 ;
205+ }else if (_sample_rate == 16000 ) {
206+ freqIdx = 8 ;
207+ }else if (_sample_rate == 8000 ) {
208+ freqIdx = 11 ;
209+ }
207210 /* 其中,samplingFreguencyIndex 对应关系如下:
208211 0 - 96000
209212 1 - 88200
0 commit comments