问题与MTAudioProcessingTap对设备
问题描述:
我试图创建一个基于从这篇博客教程的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];
答
这显然的错误在6.0(其我的设备仍然在)。模拟器已打开6.1
升级到6.1.2的设备并且错误消失。
我一直在尝试使用MTAudioProcessingTap,并花了数天的时间试图找出如何让它在我完成时解除分配。也许你可以帮助解决这个问题? http://*.com/q/19202306/506796 – Tenfour04 2013-10-08 18:18:27