2013-03-12 178 views
3

我试图创建一个基于从这篇博客教程的MTAudioProcessingTap - http://chritto.wordpress.com/2013/01/07/processing-avplayers-audio-with-mtaudioprocessingtap/问题与MTAudioProcessingTap对设备

问题正在与各种音频格式。我已经能够用M4A成功创建一个水龙头,但它不适用于MP3。对我来说更陌生 - 代码可以在两种格式的模拟器上运行,但不能在设备上运行(仅适用于m4a)。我的进程块中出现OSStatusError代码50,如果我尝试使用AudioBufferList数据,则会遇到访问不良的情况。下面是我使用的tap设置和回调。该过程块似乎是罪魁祸首(我认为),但我不知道为什么。

更新 - 它看起来像是在第一次休息一下后第一次非常零星地工作,但只是第一次。我感觉我的音频文件存在某种锁定。有没有人知道应该在无挡块进行清理工作?

取消准备块 -

void unprepare(MTAudioProcessingTapRef tap) 
{ 
NSLog(@"Unpreparing the Audio Tap Processor"); 
} 

过程块(将得到OSStatus错误50) -

void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames, 
     MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut, 
     CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut) 
{ 
OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, 
                flagsOut, NULL, numberFramesOut); 
if (err) NSLog(@"Error from GetSourceAudio: %ld", err); 
} 

点击设置 -

NSURL *assetURL = [[NSBundle mainBundle] URLForResource:@"DLP" withExtension:@"mp3"]; 
assert(assetURL); 

// Create the AVAsset 
AVAsset *asset = [AVAsset assetWithURL:assetURL]; 
assert(asset); 

// Create the AVPlayerItem 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
assert(playerItem); 

assert([asset tracks]); 
assert([[asset tracks] count]); 

self.player = [AVPlayer playerWithPlayerItem:playerItem]; 
assert(self.player); 

// Continuing on from where we created the AVAsset... 
AVAssetTrack *audioTrack = [[asset tracks] objectAtIndex:0]; 
AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack]; 

// Create a processing tap for the input parameters 
MTAudioProcessingTapCallbacks callbacks; 
callbacks.version = kMTAudioProcessingTapCallbacksVersion_0; 
callbacks.clientInfo = (__bridge void *)(self); 
callbacks.init = init; 
callbacks.prepare = prepare; 
callbacks.process = process; 
callbacks.unprepare = unprepare; 
callbacks.finalize = finalize; 

MTAudioProcessingTapRef tap; 
// The create function makes a copy of our callbacks struct 
OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, 
              kMTAudioProcessingTapCreationFlag_PostEffects, &tap); 
if (err || !tap) { 
    NSLog(@"Unable to create the Audio Processing Tap"); 
    return; 
} 
assert(tap); 

// Assign the tap to the input parameters 
inputParams.audioTapProcessor = tap; 
// Create a new AVAudioMix and assign it to our AVPlayerItem 
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
audioMix.inputParameters = @[inputParams]; 
playerItem.audioMix = audioMix; 

// And then we create the AVPlayer with the playerItem, and send it the play message... 
[self.player play]; 

回答

2

这显然的错误在6.0(其我的设备仍然在)。模拟器已打开6.1

升级到6.1.2的设备并且错误消失。

+0

我一直在尝试使用MTAudioProcessingTap,并花了数天的时间试图找出如何让它在我完成时解除分配。也许你可以帮助解决这个问题? http://stackoverflow.com/q/19202306/506796 – Tenfour04 2013-10-08 18:18:27