Macos 如何通知我某部电影已被确定为非电影?

Macos 如何通知我某部电影已被确定为非电影?,macos,avfoundation,avplayer,Macos,Avfoundation,Avplayer,我正在编写一个Mac应用程序,使用AVPlayer播放MPEG-4电影 我的应用程序通过“打开位置”对话框支持本地电影和来自互联网的电影。在后一种情况下,当用户输入URL并按下OK按钮时,“我的应用程序”将URL作为文档打开 本地文件很容易启动。启动服务会告诉Finder、Dock等不要为任何不是.mp4或类似文件的本地文件启动我的应用程序。如果用户强制我的应用程序打开某个随机文件(例如,按住⌘ 当把它拖到我的应用程序上时),那是他们自己的错 非本地(如互联网)URL是问题所在。如果我提供的UR

我正在编写一个Mac应用程序,使用AVPlayer播放MPEG-4电影

我的应用程序通过“打开位置”对话框支持本地电影和来自互联网的电影。在后一种情况下,当用户输入URL并按下OK按钮时,“我的应用程序”将URL作为文档打开

本地文件很容易启动。启动服务会告诉Finder、Dock等不要为任何不是.mp4或类似文件的本地文件启动我的应用程序。如果用户强制我的应用程序打开某个随机文件(例如,按住⌘ 当把它拖到我的应用程序上时),那是他们自己的错

非本地(如互联网)URL是问题所在。如果我提供的URL不指向MPEG-4,我需要显示警报并关闭文档

当然,我不是自己下载网址;我只是把它交给AVPlayer

所以我需要一种方式让我的AVPlayer通知我,我给它的不是电影

  • 我试着观察玩家的
    状态
    。设置为
    AVPlayerStatusReadyToPlay
  • 我试着观察玩家的
    currentItem
    曲目。至少在Lion上,对于无效的电影,项目的
    轨道
    永远不会改变。(这是可以理解的,它改变的唯一原因是即将出现的曲目,根据定义,这对于非电影来说是不可能的。)
  • 状态
    改变时,我不能只检查
    轨迹
    ,因为这可能还没有设置(在小牛上,
    状态
    轨迹
    改变之前)

那么,我的AVPlayer如何通知我,它已经确定URL所指的内容不是它可以播放的内容?

这绝对不是确定的,但根据我的经验,当播放器的
状态变为
AVPlayerStatusReadyToPlay
时,您可以检查玩家的
currentItem
asset
playable
属性。如果
playable
YES
,则可以假定URL指向可行的MP4。如果没有,你可以假设它没有

- (void) observeValueForKeyPath:(NSString*)keyPath
                       ofObject:(id)object
                         change:(NSDictionary*)change
                        context:(void*)context
{
    if( [keyPath isEqualToString:@"status"] ) {
        if( self.player.status == AVPlayerStatusReadyToPlay && 
            self.player.currentItem.asset.playable ) {
            [self.playerView.player play];
        }
        else {
            // TODO: show an error dialog here.
            [self.window close];
        }
    }
}
我在我的一个应用程序中编写了类似于上面的代码,在我尝试过的每种情况下,它似乎都能按预期工作。如果你愿意,我可以用它制作一个测试应用程序。

这在大多数情况下都有效,但我只是遇到了一部它不适用的电影:电影是可播放的(在没有提供此表的较旧版本中验证),但资产的
可播放的
在特定时间点不是真的。