2013-07-15 20 views
10

O anda çalmakta olan videodan gerçek zamanlı ses ve video parçalarını analiz eden bir video oynatıcı yaptım. Videolar iOS cihazında (Uygulamalar Belgeleri dizininde) depolanır.iOS: Airplay'den Ses ve Video bağlantısı

Her şey yolunda. Tüm ses örneklerini almak ve bazı FFT yapmak için MTAudioProcessingTap kullanıyorum ve video oynatma işlemini şu anda çalınan CMTime (AVPlayer currentTime özelliği) piksel piksellerini kopyalayarak yapıyorum. Dediğim gibi, bu iyi çalışıyor.

Ancak şimdi Airplay'i desteklemek istiyorum. Sadece Airplay'in kendisi zor değil, ancak Airplay açıldığında ve video ATV'de oynatılırken musluklarım çalışmaya devam ediyor. Her nasılsa, MTAudioProcessingTap işlenmeyecek ve pixelbuffers hepsi boş ... Verilere ulaşamıyorum.

Bu verilere ulaşmanın bir yolu var mı?

Piksel tamponlarını elde etmek için, sadece birkaç mili saniyede bir olayı tetikleyip oyuncunun currentTime'ı alıyorum. Ardından:

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 benim pixelbuffer ve videoOutputAVPlayerItemVideoOutput bir örneğidir. Ses için

, ben kullanın:

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; 

Saygılarımızla, Niek İşte

+0

Eğer piksel tamponlarını erişiyorsunuz kodu ekleyin lütfen? –

+0

Ve video oynatma kodu da yardımcı olabilir :) –

+0

Bitti. Düşüncesi olan var mı ? –

cevap

-2

çözüm:

bu AirPlay'i uygulamaktır, benim app i sadece Ses için bu kodu kullanın video için geliştirip geliştiremeyeceğinizi bilmiyorsunuz, ancak aşağıdakileri deneyebilirsiniz:)

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]; 
} 

LockScreen denetimini uygulamak için güzel bir şekilde bir müzik yayını kullanıyorsanız, ArtWork, Stop/play, Title ecc. size oyuncu Kullanım DetailViewController bu kod ise

: Bu kod size yardımcı olabilir

- (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}; 

    } 

} 

Umut;)

+0

Airplay kullanmak sorun değil, ancak gerçek zamanlı ses ve video verilerini analiz ediyor. –