【问题标题】:How to check if AVPlayer has Video or just Audio?如何检查 AVPlayer 是否有视频或只有音频?
【发布时间】:2012-07-27 02:34:10
【问题描述】:

我尝试播放一些“媒体”,但在 AVPlayer 启动时我不知道它是音频还是视频。

我连接了播放器层,它工作正常。

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

但是如何检查是否有视频,以便我可以添加/删除一些选项?

【问题讨论】:

    标签: xcode audio video avplayer


    【解决方案1】:

    来自 Apple 的示例代码项目 AVSimplePlayer:

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

    【讨论】:

    • 这对我不起作用;我正在阅读视频和音频流,计数始终为 0
    • 我这对你不起作用,也许你做得太早了。等到您的播放器项目状态变为 readyToPlay。
    【解决方案2】:

    对于 Swift 4.2,您可以执行以下操作:

    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   
    }
    

    或作为扩展

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

    【讨论】:

    • “AVPlayer”类型的值没有成员“_asset”:(
    • 只需将_asset替换为asset
    【解决方案3】:

    我不确定,但 AVPlayerItem 有以下数组 [mPlayerItem.asset.tracks] 这包含两个对象,一个用于视频,另一个用于音频。按如下方式访问它:[mPlayerItem.asset.tracks objectAtIndex:0] 用于视频,[mPlayerItem.asset.tracks objectAtIndex:1] 用于音频。

    【讨论】:

      【解决方案4】:

      这对我有帮助:

          // 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
          }
      

      【讨论】:

      • 你在两个函数中都做同样的事情 :) 你确定这是故意的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2020-04-17
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多