2013-03-12 175 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