如何在Apple TV上播放视频?

Eth*_*len 22 xcode apple-tv tvos

我开始了一个空白的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];  
}  
Run Code Online (Sandbox Code Playgroud)

一旦应用加载,模拟器中没有任何事情发生.没有视频,没有,只是我的Apple TV模拟器中的空白半透明屏幕.

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

lem*_*ojo 18

我只是将您的代码粘贴到我的tvOS示例项目中,替换了URL并运行它.

没啥事儿.好吧,除了有一个日志条目告诉我App Transport Security阻止了我的URL请求.

所以我前往Info.plist,禁用了ATS,在下次发布时,视频显示就好了.

因此,如果您还使用非HTTPS网址,则很可能遇到此问题,可以通过使用HTTPS网址,完全禁用ATS或允许Info.plist中的特定非HTTP网址轻松解决此问题.

PS:我用这个视频进行测试.

  • 谢谢!完全忘了iOS 9现在需要HTTPS,除非它被关闭. (2认同)

Ale*_*ley 11

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

坚持'TVApplicationControllerDelegate'协议并添加一些属性.

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, TVApplicationControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

...

@property (strong, nonatomic) TVApplicationController *appController;
@property (strong, nonatomic) TVApplicationControllerContext *appControllerContext;
Run Code Online (Sandbox Code Playgroud)

然后将以下内容添加到'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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 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();  
}
Run Code Online (Sandbox Code Playgroud)

小心使用mediaItem中的这个url

设置您选择的模板.

index.tvml

<document>
  <alertTemplate>
      <title>…</title>
      <description>…</description>
      <button>
          <text>…</text>
      </button>
      <text>…</text>
  </alertTemplate>
</document>
Run Code Online (Sandbox Code Playgroud)

打开终端并导航到此文件夹然后运行

python -m SimpleHTTPServer 8000
Run Code Online (Sandbox Code Playgroud)

确保此处的端口是ObjC网址中的端口.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或链接到网络上的视频.这SO答案指出我在那里.


Jes*_*ers 6

在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];
Run Code Online (Sandbox Code Playgroud)

同样如下所述,请确保您尝试播放的视频来自HTTPS连接,或者您通过在plist中设置正确的标记来禁用App Transport Security.


Sim*_*son 5

我不喜欢与子视图等有关的答案.对于全屏播放,我使用以下(非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];
}];
Run Code Online (Sandbox Code Playgroud)

当您点击MENU按钮时,这非常简洁,动画显示和淡出回到上一个视图.此外,它使用所有标准功能的遥控器很好.