現在再生中のビデオからリアルタイムのオーディオおよびビデオ トラックを分析するビデオ プレーヤーを作成しました。ビデオは iOS デバイス (Apps Documents ディレクトリ) に保存されます。
これはすべてうまくいきます。MTAudioProcessingTap を使用してすべてのオーディオ サンプルを取得し、FFT を実行します。現在再生中の CMTime (AVPlayer currentTime プロパティ) からピクセル バッファーをコピーするだけでビデオを分析しています。私が言ったように、これはうまくいきます。
でも今はAirplayを応援したいです。Airplay 自体は難しいことではありませんが、Airplay が切り替えられ、ビデオが ATV で再生されるとすぐにタップが機能しなくなります。どういうわけか、MTAudioProcessingTap が処理されず、ピクセルバッファーがすべて空になっています...データにアクセスできません。
このデータにアクセスする方法はありますか?
ピクセル バッファを取得するには、数ミリ秒ごとにイベントを発生させ、プレーヤーの currentTime を取得します。それで:
CVPixelBufferRef imageBuffer = [videoOutput copyPixelBufferForItemTime:time itemTimeForDisplay:nil];
CVPixelBufferLockBaseAddress(imageBuffer,0);
uint8_t *tempAddress = (uint8_t *) CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
tempAddress
私のピクセルバッファはどこにありvideoOutput
、のインスタンスですAVPlayerItemVideoOutput
。
オーディオには、次を使用します。
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;
OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks,
kMTAudioProcessingTapCreationFlag_PostEffects, &tap);
if (err || !tap) {
NSLog(@"Unable to create the Audio Processing Tap");
return;
}
inputParams.audioTapProcessor = tap;
// Create a new AVAudioMix and assign it to our AVPlayerItem
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = @[inputParams];
playerItem.audioMix = audioMix;
よろしく、ニーク