Reputation: 1009
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
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
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
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
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
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
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