Jeanette Müller
Jeanette Müller

Reputation: 1009

How to check if AVPlayer has Video or just Audio?

I try to play some "media" but at the time the AVPlayer starts I don't know if it is audio or Video.

I connected the player Layer and it works fine.

self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:[[PCPlayerManager sharedManager] audioPlayer]];
avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
avPlayerLayer.frame = CGRectMake(0, 0, videoView.frame.size.width, videoView.frame.size.height);
[videoView.layer addSublayer:avPlayerLayer];

But how can I check if there is Video so I can add/remove some Options?

Upvotes: 9

Views: 6860

Answers (6)

mr. sudo
mr. sudo

Reputation: 357

UPDATED: sean-stayns answer in Swift 5.5

extension AVPlayer {
    var isAudioAvailable: Bool? {
        return self.currentItem?.asset.tracks.filter({$0.mediaType == .audio}).count != 0
    }

    var isVideoAvailable: Bool? {
        return self.currentItem?.asset.tracks.filter({$0.mediaType == .video}).count != 0
    }
}

Upvotes: 0

JhonnyTawk
JhonnyTawk

Reputation: 863

I found this better solution

func isVideoAvailable(item: AVPlayerItem) -> Bool {
        for video in item.tracks {
            if video.assetTrack?.mediaType == .video {
                return true
            }
        }
        return false
}

And this

  if currentItem.tracks.contains(where: { track in
     track.assetTrack?.mediaType == .video
  }) {

     // This Code goes Here!
  }

Upvotes: 0

RA-Develop
RA-Develop

Reputation: 1

This helped me:

    // source from https://stackoverflow.com/a/55581216 Changed for last release AVFoundation
    func isAudioAvailable() -> Bool? {
        return self.player.currentItem?.tracks.filter({$0.assetTrack!.mediaType == AVMediaType.audio}).count != 0
    }
    
    func isVideoAvailable() -> Bool? {
        return self.player.currentItem?.tracks.filter({$0.assetTrack!.mediaType == AVMediaType.video}).count != 0
    }

Upvotes: 0

Sean Stayns
Sean Stayns

Reputation: 4234

For Swift 4.2 you can do the following:

func isAudioAvailable() -> Bool? {
   return self.player?._asset?.tracks.filter({$0.mediaType == AVMediaType.audio}).count != 0   
}

func isVideoAvailable() -> Bool? {
   return self.player?._asset?.tracks.filter({$0.mediaType == AVMediaType.video}).count != 0   
}

or as extension

extension AVPlayer {
    var isAudioAvailable: Bool? {
        return self._asset?.tracks.filter({$0.mediaType == AVMediaType.audio}).count != 0
    }

    var isVideoAvailable: Bool? {
        return self._asset?.tracks.filter({$0.mediaType == AVMediaType.video}).count != 0
    }
}

Upvotes: 5

wdyp
wdyp

Reputation: 560

From Apple’s sample code project AVSimplePlayer:

// Set up an AVPlayerLayer according to whether the asset contains video.
if ([[(AVAsset *)asset tracksWithMediaType:AVMediaTypeVideo] count] != 0)

Upvotes: 12

Anil
Anil

Reputation: 2438

I'm not sure but AVPlayerItem has the following array [mPlayerItem.asset.tracks] This contains two objects,one for video and another for audio.Access it as follows [mPlayerItem.asset.tracks objectAtIndex:0] for video and [mPlayerItem.asset.tracks objectAtIndex:1] for audio.

Upvotes: 3

Related Questions