Tôi đã tạo trình phát video đang phân tích các bản âm thanh và video theo thời gian thực từ video hiện đang phát. Các video được lưu trữ trên thiết bị iOS (trong thư mục Tài liệu ứng dụng).iOS: Âm thanh và video từ Airplay
Tất cả đều hoạt động tốt. Tôi sử dụng MTAudioProcessingTap để có được tất cả các mẫu âm thanh và thực hiện một số FFT và tôi đang phân tích video bằng cách chỉ sao chép các bộ đệm pixel từ CMTime hiện đang phát (thuộc tính currentTime của AVPlayer). Như tôi đã nói, điều này hoạt động tốt.
Nhưng giờ tôi muốn hỗ trợ Airplay. Chỉ có bản thân bản thân nó không khó, nhưng vòi nước của tôi ngừng hoạt động ngay sau khi Airplay được bật lên và video đang phát trên ATV. Bằng cách nào đó, MTAudioProcessingTap sẽ không xử lý và các pixelbuffers đều trống ... Tôi không thể lấy dữ liệu.
Có cách nào để truy cập dữ liệu này không?
Để nhận bộ đệm pixel, tôi chỉ kích hoạt một sự kiện cứ sau vài milli giây và truy xuất currentTime của trình phát. Sau đó:
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);
đâu tempAddress
là pixelbuffer của tôi, và videoOutput
là một thể hiện của AVPlayerItemVideoOutput
.
Đối với âm thanh, tôi sử dụng:
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;
Kính trọng, Niek
Ông có thể thêm mã nơi bạn đang truy cập vào bộ đệm điểm ảnh? –
Và mã để phát video cũng có thể giúp ích :) –
Xong. bất kỳ suy nghĩ nào? –