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