Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

Итак, я направился в Info.plist, отключенный ATS, и после следующего запуска видео появилось просто отлично.

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

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

Ответ 2

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

Затем добавьте следующее в 'doneFinishLaunchingWithOptions'

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

Настройте template по вашему выбору.

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, либо ссылку на видео в Интернете. Этот fooobar.com/questions/130990/... ответ указал мне там.

Ответ 3

Лучшим способом воспроизведения видео в приложении на AppleTV будет AVKit AVPlayerViewController. Если вы используете AVKit, вы получаете много материала бесплатно.

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

Вы просто добавляете этого игрока в свойство player 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-соединения, либо из-за того, что вы отключили приложение Transport Security, установив соответствующие флаги в plist.

Ответ 4

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

Ответ 5

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

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

}

Ответ 6

Быстрая версия Создайте 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()
}

Примечание Вопрос и некоторые ответы могут быть немного обманчивыми, так что вы можете подумать, что только URL с ".mp4" в конце может воспроизводиться Apple TV. Я так поверила, что впервые увидела пост. Это не верно. Фактически, с помощью 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 для получения ссылки на канал для определенного видео.