10

現在再生中のビデオからリアルタイムのオーディオおよびビデオ トラックを分析するビデオ プレーヤーを作成しました。ビデオは 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;

よろしく、ニーク

4

2 に答える 2