ios-オーディオAAC復号
7711 ワード
前回はオーディオAACコードと言いましたが、今回はコードしたファイルを復号し、復号したファイルは前章で録画したオーディオです.
iOSでのオーディオ復号および再生の流れは、1、AACファイルを開く.2、オーディオフォーマット情報を取得する.チャネル数、サンプリングレートなど.3.AACファイルから1フレームのAACデータを取り出す.4、AudioToolboxを使用してAACパケットを復号する.5、復号したPCMデータをAudioUnitに送って音声を再生する.6、AACファイル全体が読み終わるまで3-5ステップ繰り返します.
AACDecoder.m
ViewController.m
ここでAACコードのファイルをデコードして再生します.
オーディオAACコードについて
Demoダウンロードアドレス
iOSでのオーディオ復号および再生の流れは、1、AACファイルを開く.2、オーディオフォーマット情報を取得する.チャネル数、サンプリングレートなど.3.AACファイルから1フレームのAACデータを取り出す.4、AudioToolboxを使用してAACパケットを復号する.5、復号したPCMデータをAudioUnitに送って音声を再生する.6、AACファイル全体が読み終わるまで3-5ステップ繰り返します.
AACDecoder.m
- (void)customAudioConfig {
//NSURL *url = [[NSBundle mainBundle] URLForResource:@"abc" withExtension:@"aac"];
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *path = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSURL *url = [path URLByAppendingPathComponent:@"abc.aac"];
// AAC 。
OSStatus status = AudioFileOpenURL((__bridge CFURLRef)url, kAudioFileReadPermission, 0, &audioFileID); //Open an existing audio file specified by a URL.
if (status != noErr) {
NSLog(@" %@", url);
return ;
}
uint32_t size = sizeof(audioStreamBasicDescrpition);
status = AudioFileGetProperty(audioFileID, kAudioFilePropertyDataFormat, &size, &audioStreamBasicDescrpition); // Gets the value of an audio file property.
NSAssert(status == noErr, @"error");
status = AudioQueueNewOutput(&audioStreamBasicDescrpition, bufferReady, (__bridge void * _Nullable)(self), NULL, NULL, 0, &audioQueue); // Creates a new playback audio queue object.
NSAssert(status == noErr, @"error");
if (audioStreamBasicDescrpition.mBytesPerPacket == 0 || audioStreamBasicDescrpition.mFramesPerPacket == 0) {
uint32_t maxSize;
size = sizeof(maxSize);
AudioFileGetProperty(audioFileID, kAudioFilePropertyPacketSizeUpperBound, &size, &maxSize); // The theoretical maximum packet size in the file.
if (maxSize > CONST_BUFFER_SIZE) {
maxSize = CONST_BUFFER_SIZE;
}
packetNums = CONST_BUFFER_SIZE / maxSize;
audioStreamPacketDescrption = malloc(sizeof(AudioStreamPacketDescription) * packetNums);
}
else {
packetNums = CONST_BUFFER_SIZE / audioStreamBasicDescrpition.mBytesPerPacket;
audioStreamPacketDescrption = nil;
}
char cookies[100];
memset(cookies, 0, sizeof(cookies));
// 100
AudioFileGetProperty(audioFileID, kAudioFilePropertyMagicCookieData, &size, cookies); // Some file types require that a magic cookie be provided before packets can be written to an audio file.
if (size > 0) {
AudioQueueSetProperty(audioQueue, kAudioQueueProperty_MagicCookie, cookies, size); // Sets an audio queue property value.
}
readedPacket = 0;
// 3-5 , 。
for (int i = 0; i < CONST_BUFFER_COUNT; ++i) {
AudioQueueAllocateBuffer(audioQueue, CONST_BUFFER_SIZE, &audioBuffers[i]); // Asks an audio queue object to allocate an audio queue buffer.
if ([self fillBuffer:audioBuffers[i]]) {
// full
break;
}
NSLog(@"buffer%d full", i);
}
}
void bufferReady(void *inUserData,AudioQueueRef inAQ,
AudioQueueBufferRef buffer){
NSLog(@"refresh buffer");
AACDecoder* player = (__bridge AACDecoder *)inUserData;
if (!player) {
NSLog(@"player nil");
return ;
}
if ([player fillBuffer:buffer]) {
NSLog(@"play end");
}
}
- (bool)fillBuffer:(AudioQueueBufferRef)buffer {
bool full = NO;
uint32_t bytes = 0, packets = (uint32_t)packetNums;
OSStatus status = AudioFileReadPackets(audioFileID, NO, &bytes, audioStreamPacketDescrption, readedPacket, &packets, buffer->mAudioData); // Reads packets of audio data from an audio file.
NSAssert(status == noErr, ([NSString stringWithFormat:@"error status %d", status]) );
if (packets > 0) {
buffer->mAudioDataByteSize = bytes;
AudioQueueEnqueueBuffer(audioQueue, buffer, packets, audioStreamPacketDescrption);
readedPacket += packets;
}
else {
AudioQueueStop(audioQueue, NO);
full = YES;
}
return full;
}
- (void)play {
AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, 1.0); // Sets a playback audio queue parameter value.
AudioQueueStart(audioQueue, NULL); // Begins playing or recording audio.
}
ViewController.m
- (void)decoderPlay{
//
self.player = [[AACDecoder alloc] init];
[self.player play];
}
ここでAACコードのファイルをデコードして再生します.
オーディオAACコードについて
Demoダウンロードアドレス