web-dev-qa-db-fra.com

Comment lire une vidéo sur tvOS pour Apple TV?

J'ai commencé un projet tvOS vierge et créé le code suivant:

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

Rien ne se passe cependant dans le simulateur une fois l'application chargée. Pas de vidéo, rien, juste un écran translucide vierge dans mon Apple simulateur TV.

Quelle est la bonne façon de lire un exemple de vidéo au lancement de l'application pour une application TV Apple TV à partir d'une source HTTP?

22
Ethan Allen

Je viens de coller votre code dans mon exemple de projet tvOS, de remplacer l'URL et de l'exécuter.

Rien ne s'est passé. Eh bien, à l'exception du fait qu'il y a une entrée de journal me disant que App Transport Security a bloqué ma demande d'URL.

Je me suis donc dirigé vers Info.plist, ATS désactivé et au prochain lancement, la vidéo s'est très bien déroulée.

Donc, si vous utilisez également une URL non HTTPS, vous rencontrez très probablement ce problème qui est facilement résolu en utilisant une URL HTTPS, en désactivant complètement ATS ou en autorisant des URL non HTTP spécifiques dans votre Info.plist.

P.S .: J'ai utilisé cette vidéo pour les tests.

18
lemonmojo

Vous pouvez également utiliser TVML et TVMLJS https://developer.Apple.com/library/prerelease/tvos/documentation/TVMLJS/Reference/TVJSFrameworkReference/

Adhérez au protocole 'TVApplicationControllerDelegate' et ajoutez quelques propriétés.

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, TVApplicationControllerDelegate>

...

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

Ajoutez ensuite ce qui suit à '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;
}

créer un dossier et ajouter les fichiers suivants

  • 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();  
}

attention à cette url dans le mediaItem

Configurez un modèle de votre choix.

index.tvml

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

ouvrez le terminal et accédez à ce dossier, puis exécutez

python -m SimpleHTTPServer 8000

assurez-vous que le port ici est le port de votre URL ObjC. Les exemples Apple Apple utilisent 9001.

Voir ces tutoriels pour plus d'informations

http://jamesonquave.com/blog/developing-tvos-apps-for-Apple-tv-with-Swift/http://jamesonquave.com/blog/developing-tvos -apps-pour-Apple-tv-part-2 /

Un problème que j'ai rencontré était d'essayer de lire un fichier vidéo local. Cela ne fonctionnerait pas et il y avait des problèmes de contraintes, etc. Il semble que vous ne puissiez pas utiliser python pour lire les vidéos, alors essayez Apache ou créez un lien vers une vidéo sur le Web. Ce - DONC la réponse m'a pointé là-bas.

11
Alex Hedley

La meilleure façon de lire des vidéos dans votre application sur AppleTV sera AVPlayerViewController d'AVKit. Si vous utilisez AVKit, vous obtenez beaucoup de choses gratuitement.

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

Vous ajoutez simplement ce joueur à la propriété du lecteur de 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];

De même, comme indiqué ci-dessous, assurez-vous que la vidéo que vous essayez de lire provient soit d'une connexion HTTPS, soit que vous avez désactivé App Transport Security en définissant les indicateurs appropriés dans le plist.

6
Jess Bowers

Je n'ai pas aimé les réponses qui dérangeaient avec les sous-vues, etc. Pour la lecture en plein écran, j'utilise le code (non-ARC) suivant:

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

Cela fonctionne vraiment bien, animant la présentation et revenant à la vue précédente lorsque vous appuyez sur le bouton MENU. En outre, il fonctionne très bien avec la télécommande en utilisant toutes les fonctions standard.

5
Simon Tillson

Cela fonctionne pour moi. Peut vous être utile

 -(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
Gautam