24

我开始了一个空白的 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 应用程序在应用程序启动时播放示例视频的正确方法是什么?

4

6 回答 6

19

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

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

所以我前往 Info.plist,禁用了 ATS,下次启动时视频显示得很好。

因此,如果您还使用非 HTTPS URL,您很可能会遇到此问题,该问题可以通过使用 HTTPS URL、完全禁用 ATS 或在 Info.plist 中允许特定的非 HTTPS URL 轻松解决。

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

于 2015-09-10T08:27:10.573 回答
11

您还可以使用 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
  • 索引.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

设置您选择的模板

索引.tvml

<document>
  <alertTemplate>
      <title>…&lt;/title>
      <description>…&lt;/description>
      <button>
          <text>…&lt;/text>
      </button>
      <text>…&lt;/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 或链接到网络上的视频。这个SO answer 指向了我。

于 2015-09-13T15:56:31.047 回答
6

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

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

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

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

于 2015-09-10T13:38:48.857 回答
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];
}];

当您点击 MENU 按钮时,这真的很整洁,动画演示和淡出回到以前的视图。此外,它适用于使用所有标准功能的遥控器。

于 2015-10-11T17:04:12.420 回答
1

它为我工作。可能对你有帮助

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

}
于 2015-12-29T06:13:29.083 回答
-1

Swift 版本制作一个继承 AVPlayerViewController 的 PlayViewController。在具有播放按钮的视图控制器中,添加这样的功能

@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。我第一次看到这个帖子的时候就这么相信了。这不是真的。事实上,使用 AVPlayerViewController 你可以播放 Vimeo 流视频!流视频的链接不像https://vimeo.com/92655878。可以通过从 json 文件中提取它来从 Vimeo 站点获取它,该文件可以从此链接下载

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

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

于 2016-05-04T05:11:17.927 回答