Comment lire des fichiers vidéo sans extension de fichier sur iOS avec MPMoviePlayerController ou AVPlayer?

Je veux jouer un film dans iOS 4.3 sur l'iPad. J'ai utilisé avec succès MPMoviePlayerController et AVPlayer pour charger des fichiers à partir d'une URL distante lorsque le nom de fichier a une extension de fichier. Cependant, lorsque j'utilise un CDN qui ne renvoie pas le nom de fichier (juste un nom aléatoire Non devinable), ni MPMoviePlayerController ni AVPlayer ne semblent capables de faire face.

Est-il un moyen de dire au joueur que c'est vraiment un film de type x et il devrait continuer à jouer il?

MPMoviePlayerController renverra l'erreur suivante à partir de sa notification d'état modifiée:

{
    MPMoviePlayerPlaybackDidFinishReasonUserInfoKey = 1;
    error = "Error Domain=MediaPlayerErrorDomain Code=-12847 "This movie format is not supported." UserInfo=0x5b60030 {NSLocalizedDescription=This movie format is not supported.}";
}

Je sais que ce fichier est un fichier M4V valide, car quand je renommer tout va bien.

24
demandé sur Srikar Appalaraju 2011-03-31 18:43:15

7 réponses

Si le lecteur ne peut pas deviner le format de fichier, vous devez vérifier que le CDN renvoie le bon type mime. Je suppose que votre CDN ne peut pas deviner le mimetype correctement ni le lecteur.

Dans la plupart des cas, cela est dû à la façon dont le CDN présente L'en-tête HTTP. Vérifiez que l'en-tête "Content-Type" est défini sur un format vidéo correspondant à votre contenu.

4
répondu Magnus 2012-03-31 11:44:08

Fichier à tmp

NSString* _filePath

Créer un lien symbolique

NSFileManager *filemgr = [NSFileManager defaultManager];
NSString *slink = [_filePath stringByAppendingPathExtension:@"m4v"];
if (![filemgr fileExistsAtPath:slink]) {
    NSError *error = nil;
    [filemgr createSymbolicLinkAtPath:[_filePath stringByAppendingPathExtension:@"m4v"] withDestinationPath: _filePath error: &error];
    if (error) {
        ...
    }
}
...

Jeu vidéo par slink

6
répondu Andrii A Tishchenko 2013-05-08 14:58:09

Dylan est correct.

MPMoviePlayer et AVPlayer ont besoin D'une extension de fichier pour lire le fichier à partir de L'URL, sinon un message d'erreur s'affichera. Mieux vaut utiliser une sorte de trucs.

2
répondu Tarun 2012-03-09 09:11:38

IPhone soutien vidéo H. 264, MPEG - 4 dans .mp4,.m4v, .formats mov et fichiers audio en AAC, MP3, M4A, Apple lossless et Audible. Vous pouvez utiliser la méthode-contentsOfDirectoryAtPath:error: de NSFileManager pour obtenir un tableau avec le contenu d'un répertoire (sous forme de chaînes).Ensuite, vous faites juste des opérations de chaînes .

1
répondu imdhresh 2011-09-22 09:30:37

Si vous avez des problèmes pour obtenir le ContentType de votre connexion, vous pouvez parcourir les types MIME jouables et créer des liens symboliques vers le fichier réel avec l'extension et vérifier s'ils sont jouables. Comme ça:

NSLog(@"linked path: %@",[videoURL absoluteString]);
NSString* linkedPath;
AVURLAsset* asset;
NSFileManager *filemgr = [NSFileManager defaultManager];

for (NSString* string in [AVURLAsset audiovisualMIMETypes]) {

    if ([string containsString:@"video/"]) {

        NSLog(@"Trying: %@",string);

        linkedPath = [[videoURL absoluteString] stringByAppendingPathExtension:[string stringByReplacingOccurrencesOfString:@"video/" withString:@""]];
        NSLog(@"linked path: %@",linkedPath);

        if (![filemgr fileExistsAtPath:linkedPath]) {
            NSError *error = nil;
            [filemgr createSymbolicLinkAtURL:[NSURL URLWithString:linkedPath] withDestinationURL:videoURL error:&error];
            if (error) {
               NSLog(@"error %@",error.localizedDescription);
            }
        }

       asset = [AVURLAsset assetWithURL:[NSURL URLWithString:linkedPath]];
        if ([asset isPlayable]) {
            NSLog(@"Playable");
            break;
        }else{
            NSLog(@"Not Playable");
            asset = nil;
        }
    }

}
1
répondu ben 2016-08-26 12:46:13

C'est une sorte de hack, mais ce que vous pouvez faire est d'exécuter chaque nom via une méthode qui vérifie une période Avec Trois Caractères après. Si non, il suffit de l'ajouter .m4v automatiquement. Ou obtenez le type MIME et ajoutez une extension automatiquement en fonction du type renvoyé. Si elle est disponible. Recherchez la documentation avec NSString pour plus d'informations. Bonne chance! Faites-moi savoir si cela a aidé.

0
répondu Dylan Gattey 2011-08-13 08:42:43

WebKit gère cela par une optionPrivate AVURLAsset: AVURLAssetOutOfBandMIMETypeKey, cette option est utilisée lorsque vous spécifiez un type MIME dans la balise video HTML,

Vous pouvez utiliser cette option comme:

NSString * mimeType = @"video/mp4";

// or even with codecs
mimeType = @"video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"";

// create asset
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:url options:@{@"AVURLAssetOutOfBandMIMETypeKey": mimeType}];

// create AVPlayer with AVURLAsset
AVPlayer * player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];

Comme il s'agit d'une clé privée, vous pouvez l'obscurcir si vous prévoyez de la soumettre à AppStore.

La source WebKit peut être trouvée ici: https://opensource.apple.com/source/WebCore/WebCore-7604.1.38.1.6/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm.auto.html

0
répondu naituw 2018-02-02 09:11:30