2013-07-15 48 views
10

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

+0

Ông có thể thêm mã nơi bạn đang truy cập vào bộ đệm điểm ảnh? –

+0

Và mã để phát video cũng có thể giúp ích :) –

+0

Xong. bất kỳ suy nghĩ nào? –

Trả lời

-2

Dưới đây là giải pháp:

này là thực hiện AirPlay, tôi sử dụng mã này chỉ dành cho âm thanh trên ứng dụng của tôi không biết liệu bạn có thể cải thiện video hay không nhưng bạn có thể thử;)

Trên AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    [RADStyle applyStyle]; 
    [radiosound superclass]; 
    [self downloadZip]; 

    NSError *sessionError = nil; 
    [[AVAudioSession sharedInstance] setDelegate:self]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 

    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 

    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
} 

Nếu bạn sử dụng chế độ phát sóng tốt để thực hiện điều khiển LockScreen, ArtWork, Stop/play, Title ecc.

Trong DetailViewController của bạn sử dụng máy nghe nhạc mã này:

- (BOOL)canBecomeFirstResponder { 

    return YES; 
} 
- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 

    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString: (self.saved)[@"image"]]]; 

    if (imageData == nil){ 

    MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter]; 
    MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"lockScreen.png"]]; 

    infoCenter.nowPlayingInfo = @{MPMediaItemPropertyTitle: saved[@"web"],MPMediaItemPropertyArtist: saved[@"title"], MPMediaItemPropertyArtwork:albumArt}; 

    } else { 

     MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter]; 
     MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageWithData:imageData]]; 

     infoCenter.nowPlayingInfo = @{MPMediaItemPropertyTitle: saved[@"link"],MPMediaItemPropertyArtist: saved[@"title"], MPMediaItemPropertyArtwork:albumArt}; 

    } 

} 

Hope mã này có thể giúp bạn;)

+0

Sử dụng phát sóng không phải là vấn đề, nhưng phân tích dữ liệu âm thanh và video thời gian thực là. –

Các vấn đề liên quan