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