Jak odtwarzać wideo w tvOS Na Apple TV?

Rozpocząłem pusty projekt tvOS i stworzyłem następujący kod:

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

Nic się nie dzieje w symulatorze po załadowaniu aplikacji. Żadnego wideo, nic, tylko pusty półprzezroczysty ekran w moim symulatorze Apple TV.

Jaki jest właściwy sposób odtwarzania przykładowego filmu podczas uruchamiania aplikacji Apple TV ze źródła HTTP?

Author: rmaddy, 2015-09-10

6 answers

Właśnie wkleiłem Twój kod do mojego przykładowego projektu tvOS, podmieniłem adres URL i uruchomiłem go.

Nic się nie stało. Cóż, z wyjątkiem faktu, że jest wpis w dzienniku informujący mnie, że bezpieczeństwo transportu aplikacji zablokowało moją prośbę o adres URL.

Więc udałem się do Info.plist, wyłączył ATS i po następnym uruchomieniu wideo pokazało się dobrze.

Więc jeśli używasz również adresu URL innego niż HTTPS, najprawdopodobniej napotkasz ten problem, który można łatwo naprawić za pomocą adresu URL HTTPS, całkowite wyłączenie ATS lub dopuszczenie określonych adresów URL innych niż HTTPs w Twoich informacjach.plist.

P. S.: użyłem tego filmu do testów.

 19
Author: lemonmojo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03

Możesz również użyć TVML i TVMLJS https://developer.apple.com/library/prerelease/tvos/documentation/TVMLJS/Reference/TVJSFrameworkReference/

Zastosuj się do protokołu 'TVApplicationControllerDelegate' i dodaj kilka właściwości.

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, TVApplicationControllerDelegate>

...

@property (strong, nonatomic) TVApplicationController *appController;
@property (strong, nonatomic) TVApplicationControllerContext *appControllerContext;

Następnie dodaj następujący tekst do "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;
}

Utwórz folder i dodaj następujące pliki

  • main.js
  • indeks.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();  
}

ostrożnie z tym url w mediaItem

Ustaw szablon do wyboru.

Indeks.tvml

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

Otwórz terminal i przejdź do tego folderu, a następnie uruchom

python -m SimpleHTTPServer 8000

Upewnij się, że port jest portem w adresie URL obiektu. Przykłady Apple używają 9001.

Zobacz te samouczki, aby uzyskać więcej informacji info

Http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-with-swift / http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-part-2/

Jeden problem, na który wpadłem, to próba odtworzenia lokalnego pliku wideo. To nie zadziała i były problemy z ograniczeniami itp. Wygląda na to, że nie możesz użyć Pythona do odtwarzania filmów, więc spróbuj apache lub link do filmu w Internecie. Tawięc odpowiedź wskazała mi tam.
 11
Author: Alex Hedley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:01

Najlepszym sposobem na odtwarzanie wideo w aplikacji na AppleTV będzie Avkit ' s AVPlayerViewController. Jeśli używasz AVKit, dostajesz wiele rzeczy za darmo.

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

Po prostu dodajesz ten odtwarzacz do właściwości odtwarzacza viewcontrollera:

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

Jak wspomniano poniżej, upewnij się, że wideo, które próbujesz odtworzyć, pochodzi z połączenia HTTPS lub że wyłączyłeś zabezpieczenia transportu aplikacji, ustawiając odpowiednie flagi w pliście.

 6
Author: Jess Bowers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 14:14:02

Nie podobały mi się odpowiedzi, które namieszały w podstronach itp. Do odtwarzania pełnoekranowego używam następującego kodu (Nie-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];
}];

To działa naprawdę schludnie, animowanie prezentacji i blaknięcie z powrotem do poprzedniego widoku po dotknięciu przycisku MENU. Działa również świetnie z pilotem zdalnego sterowania przy użyciu wszystkich standardowych funkcji.

 5
Author: Simon Tillson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 15:30:42

Działa na mnie. Może być pomocne dla ciebie

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

}
 1
Author: Gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 06:48:52

Wersja Swift Utwórz Kontroler PlayViewController, który dziedziczy Kontroler AVPlayerViewController. W kontrolerze viewcontroller, który ma przycisk odtwarzania, dodaj taką funkcję

@IBAction func onClickPlay(sender: AnyObject) {
    let playerVC = PlayerViewController()
    playerVC.playVideo(urlString)
    [self.presentViewController(playerVC, animated: true, completion: nil)]
}

W PlayerViewController

func playVimeoVideo(link : String) {

    player = AVPlayer(URL: NSURL(string: link)!)   
    player?.play()
}

Notice Pytanie i niektóre odpowiedzi mogą być nieco mylące, więc możesz pomyśleć, że tylko adres url z ".mp4" na końcu może być odtwarzany przez Apple TV. Wierzyłem tak, gdy pierwszy raz zobaczyłem post. To nieprawda. W rzeczywistości, z AVPlayerViewController można Odtwórz wideo strumieniowe Vimeo! Link do stream video nie jest jak https://vimeo.com/92655878 . możliwe jest uzyskanie go ze strony Vimeo poprzez wyodrębnienie go z pliku json, który można pobrać z tego linku

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

Aby uzyskać poprawny adres url filmu, musisz użyć dostępu użytkownika Vimeo Pro, aby uzyskać łącze strumienia dla określonego filmu.

 -1
Author: flame3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 07:12:01