如何在 Apple TV 的 tvOS 上播放视频?

How do I play a video on tvOS for Apple TV?

我启动了一个空白的 tvOS 项目并创建了以下代码:

- (void)viewDidLoad  
{  
    [super viewDidLoad];  

    AVPlayer *avPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://www.myurl.com/myvideo.mp4"]];  
    AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];  

    avPlayerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);  
    [self.view.layer addSublayer:avPlayerLayer];  

    [avPlayer play];  
}  

尽管应用程序加载后模拟器中没有任何反应。没有视频,什么都没有,只有我的 Apple TV 模拟器中的空白半透明屏幕。

从 HTTP 源播放 Apple TV 应用程序启动时的示例视频的正确方法是什么?

我刚刚将您的代码粘贴到我的 tvOS 示例项目中,替换了 URL 和 运行。

什么都没发生。好吧,除了有一个日志条目告诉我 App T运行sport Security 阻止了我的 URL 请求。

所以我去了 Info.plist,disabled ATS,在下次发布时视频显示正常。

因此,如果您还使用非 HTTPS URL,您很可能 运行 遇到此问题,可以通过使用 HTTPS URL、禁用完全 ATS 或在您的 Info.plist.

中允许特定的非 HTTP URL

P.S.: 我使用 this video 进行测试。

在 AppleTV 上的应用程序中播放视频的最佳方式是使用 AVKit 的 AVPlayerViewController。如果你使用 AVKit,你可以免费获得很多东西。

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayerViewController_Class/index.html

您只需将该播放器添加到 viewController 的播放器 属性:

// instantiate here or in storyboard
AVPlayerViewController *viewController = [[AVPlayerViewController alloc] initWithNibName:nil bundle:nil];
viewController.player = player;

[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];

// setup constraints, etc.

// play the video
[player play];

另外如下所述,请确保您尝试播放的视频来自 HTTPS 连接,或者您已通过在 plist 中设置适当的标志来禁用 App Transport Security。

你也可以使用 TVML 和 TVMLJS https://developer.apple.com/library/prerelease/tvos/documentation/TVMLJS/Reference/TVJSFrameworkReference/

遵守'TVApplicationControllerDelegate'协议并添加一些属性。

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, TVApplicationControllerDelegate>

...

@property (strong, nonatomic) TVApplicationController *appController;
@property (strong, nonatomic) TVApplicationControllerContext *appControllerContext;

然后将以下内容添加到'didFinishLaunchingWithOptions'

AppDelegate.m

#define url @"http://localhost:8000/main.js"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.appControllerContext = [[TVApplicationControllerContext alloc] init];
    NSURL *javascriptURL = [NSURL URLWithString:url];

    self.appControllerContext.javaScriptApplicationURL= javascriptURL;

    for (id key in launchOptions) {
        id val=[launchOptions objectForKey:key];
        NSLog(@"key=%@ value=%@", key, val);
        if([val isKindOfClass:[NSString class]]) [self.appControllerContext.launchOptions objectForKey:val];

        self.appController = [[TVApplicationController alloc] initWithContext:self.appControllerContext window:self.window delegate:self];
    }

    return YES;
}

创建文件夹并添加以下文件

  • main.js
  • index.tvml

main.js

function launchPlayer() {  
   var player = new Player();  
   var playlist = new Playlist();  
   var mediaItem = new MediaItem("video", "http://trailers.apple.com/movies/focus_features/9/9-clip_480p.mov");  
   player.playlist = playlist;  
   player.playlist.push(mediaItem);  
   player.present();
   //player.play() 
}

//in application.js  
App.onLaunch = function(options) {  
   launchPlayer();  
}

小心 mediaItem

中的这个 url

设置您选择的template

index.tvml

<document>
  <alertTemplate>
      <title>…</title>
      <description>…</description>
      <button>
          <text>…</text>
      </button>
      <text>…</text>
  </alertTemplate>
</document>

打开终端并导航到该文件夹​​,然后 运行

python -m SimpleHTTPServer 8000

确保此处的端口是您的 ObjC url 中的端口。 Apple 示例使用 9001.

有关详细信息,请参阅这些教程

http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-with-swift/ http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-part-2/

我 运行 遇到的一个问题是尝试播放本地视频文件。它行不通,并且存在约束问题等。 您似乎无法使用 python 来播放视频,因此请尝试使用 apache 或 link 来播放网络上的视频。 这个 回答指出了我那里。

我不喜欢乱用子视图等的答案。 对于全屏播放,我使用以下(非 ARC)代码:

// Play the stream
NSString *wifiStreamAddress = @"http://yourmoviefile.m3u8";
AVPlayer *player = [[AVPlayer alloc] initWithURL: [NSURL URLWithString: wifiStreamAddress] ];
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = player;

// Keep pointers to player and controller using retained properties:
self.player = player;
self.playerViewController = playerViewController;

[player release];
[playerViewController release];

[self presentViewController: playerViewController animated: true completion: ^{
    [self.player play];
}];

这非常简洁,当您点击“菜单”按钮时,演示文稿会呈现动画效果并淡化回上一个视图。此外,它与使用所有标准功能的遥控器配合使用效果很好。

它对我有用。 可能对你有帮助

 -(void)playAction
    {
   AVPlayerViewController *viewController = [[AVPlayerViewController    alloc] initWithNibName:nil bundle:nil];

   viewController.player = player;

  [self addChildViewController:viewController];

   [self.view addSubview:viewController.view];

   [viewController didMoveToParentViewController:self];

   // play the video

   [player play];

}

Swift版本 制作一个继承 AVPlayerViewController 的 PlayViewController。 在有播放按钮的viewcontroller中,添加这样的函数

@IBAction func onClickPlay(sender: AnyObject) {
    let playerVC = PlayerViewController()
    playerVC.playVideo(urlString)
    [self.presentViewController(playerVC, animated: true, completion: nil)]
}

在 PlayerViewController 中

func playVimeoVideo(link : String) {

    player = AVPlayer(URL: NSURL(string: link)!)   
    player?.play()
}

通知 这个问题和一些答案可能有点误导,所以你可能认为Apple TV 只能播放最后带有“.mp4”的url。我第一次看到post的时候就这么认为了。这不是真的。事实上,使用 AVPlayerViewController 你可以播放 Vimeo 流媒体视频!流视频的 link 与 https://vimeo.com/92655878 不同。可以通过从 json 文件中提取它来从 Vimeo 站点获取它,该文件可以从此 link

下载
let link = "https://vimeo.com/api/oembed.json?url=https%3A//vimeo.com/" + videoId

为了能够正确 url 视频,您需要使用 Vimeo Pro 用户访问权限来获取特定视频的流 link。