Как воспроизвести видео на tvOS для 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.

Как правильно воспроизвести пример видео при запуске приложения для Apple TV из источника HTTP?

6 ответов

Решение

Я просто вставил ваш код в мой пример проекта tvOS, заменил URL и запустил его.

Ничего не случилось. Ну, за исключением того факта, что есть запись в журнале, сообщающая, что App Transport Security заблокировал мой URL-запрос.

Поэтому я отправился в Info.plist, отключил ATS и при следующем запуске видео показывалось очень хорошо.

Поэтому, если вы также используете URL-адрес, отличный от HTTPS, вы, скорее всего, столкнетесь с этой проблемой, которую легко устранить, используя URL-адрес HTTPS, полностью отключив ATS или добавив определенные URL-адреса, отличные от HTTP, в ваш Info.plist.

PS: я использовал это видео для тестирования.

Вы также можете использовать 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();  
}

осторожно с этим URL в MediaItem

Установите шаблон на ваш выбор.

index.tvml

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

откройте терминал и перейдите к этой папке, затем запустите

python -m SimpleHTTPServer 8000

убедитесь, что порт здесь является портом в вашем URL 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 или ссылку на видео в Интернете. Этот ТАК ответ указал мне там.

Лучший способ воспроизвести видео в вашем приложении на AppleTV - AVPlayerViewController от AVKit. Если вы используете 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-соединению, либо что вы отключили App Transport Security, установив соответствующие флажки в списке.

Мне не понравились ответы, которые перепутались с подпредставлениями и т. Д. Для полноэкранного воспроизведения я использую следующий код (не 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. Кроме того, он прекрасно работает с пультом дистанционного управления, используя все стандартные функции.

Это работает для меня. Может быть полезно для вас

 -(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 version Создайте PlayViewController, который наследует AVPlayerViewController. В 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 может воспроизводить только URL с ".mp4" в конце. Я так и думал в первый раз, когда увидел пост. Это не правда. Фактически, с AVPlayerViewController вы можете воспроизводить потоковое видео Vimeo! Ссылка на потоковое видео не похожа на https://vimeo.com/92655878. Его можно получить с сайта Vimeo, извлекая его из файла json, который можно скачать по этой ссылке.

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

Чтобы получить правильный URL для видео, вам нужно использовать доступ пользователя Vimeo Pro, чтобы получить ссылку на поток для определенного видео.

Другие вопросы по тегам