12
votes

Est-ce que quelqu'un sait comment mettre en œuvre correctement les méthodes AvaseeTreCeloaderDelerEgate?

J'essaie de coaxer l'avfusion à lire à partir d'une URL personnalisée. L'URL personnalisé fonctionne. Le code ci-dessous crée une nsdata avec un fichier vidéo:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
{
    NSData* data = [NSData dataWithContentsOfURL:loadingRequest.request.URL];
    [loadingRequest finishLoadingWithResponse:nil data:data redirect:nil];
    return YES;
}


16 commentaires

Maintenant, il semble que la copieCgimagimageTime: Erreur: Erreur: L'appel n'attend pas que la méthode de déléguée soit terminée (la méthode de déléguée est en cours d'exécution dans la file d'attente d'expédition). La question devient donc comment puis-je vous assurer que les données ont été chargées avant la copieCGIMAGAGEATTIME: Actualité: l'appel d'erreur est effectué?


Voir "Préparation d'un actif pour une utilisation" sur développeur.apple.com/library/mac/#documentation/audiovideo/... - Votre code de génération de miniatures doit être dans un bloc de gestionnaire d'achèvement.


Merci pour le commentaire, mais mon code est correct lorsque je n'ai pas besoin de changer l'objet AvastreSourCelerer et lorsque je vais chercher à partir d'une URL HTTP ou de type de fichier. Je peux obtenir le cadre vidéo. Le problème que j'essaie de résoudre est comment puis-je l'obtenir d'une URL personnalisée. On m'a dit que AvastreSourceloader était la clé mais j'ai du mal à l'utiliser.


Loadingrequest.request.url est-il égal à @ "Memory: // vidéo"? Si l'objet Nsdata est ce que vous voulez, vous pouvez contourner l'ensemble de la question en téléchargeant les données à l'aide de NsurlConnection, écrivez-le sur disque, puis en utilisant - [Avurlasset Initwithurl: options:] ... bien que cela semble que cela semble une solution de subpar.


L'URL est correcte. Le problème semble être une condition de race entre ResourceLoader: Optez-vousPorLOPloadingOfreQueReSource: et CopyCGimageTime: Actualité: Erreur :. Ce dernier se termine avant que l'ancien complète. Je m'attendrais à ce que la méthode du délégué finisse complètement avant la fin de ce dernier. Donc, je dois les utiliser de manière incorrecte.


La raison pour laquelle j'essaie une solution d'URL personnalisée est d'éviter d'écrire sur le disque. La seule solution de travail que j'ai pour utiliser le décodeur H264 du matériel H.264 est de saisir un cadre, d'envelopper une emballage MP4 et d'écrire sur le disque. C'est Sloooow !!!! J'essaie d'éviter l'écriture du disque.


Eh bien, il semble que vous ne devriez pas essayer d'obtenir l'image tant que les données ne sont pas effectuées au chargement, ou au moins jusqu'à ce que le cadre à ce moment-là a été chargé.


C'est vrai, mais je ne sais pas comment j'attends.


Deux idées (non testées): (1) Regardez votre avumedataitems d'Avurlasset? S'il y a un avetadataitem qui indique que le cadre dont vous avez besoin est prêt (ou quels cadres sont prêts car ils sont tous pareils pour vous), vous pouvez utiliser le gestionnaire d'achèvement dans loadvaluesasynchroneforkeys: terminalhandler: . (2) Utilisez la valeur de la clé de clé pour observer les modifications apportées à votre propriété Plaçable d'Avurlasset et obtenez uniquement le cadre une fois défini sur Oui .


Belle idée - je vais essayer ça


LOADVALUESASASYNCHONELYPORTYSYSYSYSYSYNYFORKEYSYFORKES: APPLIEMENTHHANDLER: FORCE L'APPEL DE LA MÉTHODE DE DÉLÉDÉS RESSOURCLOADER: DEVOIR AUX FONCTIONNELLOFORDOFRESSOURSESOURSOURCESOURCERESOURSOURCE: Il finit complètement avant l'appel CopyCgimage, mais l'appel CopyCGIMage échoue toujours :(


Je pense que cmtimemakewithseconds (0, 600); est faux (ce serait 0 / 600e d'une seconde, ou 0, qui est avant le début du film.) Essayez CMTime Time = CMTIMemake (1 , 1);


De plus, image ne sera pas publié par arc, de sorte que vous devez faire cgimageréleuce (image); lorsque vous avez terminé avec elle. (Ceci est accessoire à votre problème, juste une fuite de mémoire.)


@Aaron - Merci pour votre aide. Le CMTIMEMAKEWithSeconds appelle fonctionne lorsque je génère une image à partir d'une URL de fichier. J'ai tout le fonctionnement de ce code lorsque je charge à partir du disque, mais j'essaie de le corroborer à charger à partir d'un tampon de mémoire. Je n'ai pas inclus tout mon code - j'utilise cgimagerelalease. Merci.


@Cthutu avez-vous fait travailler?


J'ai fait si je me suis souvenitionné, mais il s'est avéré que c'était beaucoup plus lent que de rédiger la seule image au fichier en tant que fichier MP4 et à l'utilisation de l'avexte comme normal. Je me souviens que d'être très déçu. Notre solution consistait à utiliser JPEG et à oublier H.264.


4 Réponses :


0
votes

Vous devez Créer un objet Nsurlresponse à transmettre. Vous passez en arrière nil . Sans cela, AvastreSourceloader n'a aucune idée de quoi faire avec les données que vous la faites (c'est-à-dire qu'elle n'a aucune idée du type de données qu'il s'agit - un message d'erreur, un JPEG, etc.). Vous devriez également utiliser vraiment - [nsdata datawithcontentsofurl: options: erreur:] et vérifiant une erreur avant d'assumer le succès.


3 commentaires

J'ai essayé ça - et ça n'a pas fonctionné non plus. Peut-être que c'est encore quelque chose dont j'ai besoin de toute façon. Mais ce qui se passe est que la récupération d'une trame se termine par une erreur avant la fin de la méthode du délégué. Il n'y a rien de bloquer sur le résultat de la méthode du délégué. Pour créer la réponse que j'utilise: [[[Nsurlreesponse Alloc] Initwithurl: LoadingRequest.Request.url MIMETYPE: @ "Vidéo / MP4" ExetédContentLength: Data.Length TextenCodingName: nil]


Je ne pense pas que le problème est la méthode du délégué (au moins pas le problème immédiat que je dois résoudre) car il ne se termine pas avant la copieCGimageTime: Erreur: Erreur: Retours d'appel. Il y a un problème de synchronisation entre deux threads que je ne savais pas comment résoudre.


~ Cthutu, avez-vous trouvé une solution pour cela.



1
votes

Je viens de perdre 2 heures d'essayer de faire quelque chose de très similaire.

s'avère que cela ne fonctionne que sur le périphérique et ne fonctionne pas sur le simulateur iOS!

Je suppose que l'avfusion dans le simulateur est "pontée" à l'avongation de l'hôte Mac. Malheureusement, cette API n'est pas disponible sur OS X 10.8 (selon certains commits sur le webcore, il sera disponible dans OS X 10.9), donc pour l'instant, cela ne fonctionne pas dans le simulateur.


2 commentaires

Je suis coincé avec le délégué. Je l'ai mis en œuvre mais pour une raison quelconque, j'ai reçu le statut "échoué". Avez-vous une idée?


J'ai mis en œuvre mon délégué comme celui-ci: - (BOOL) Ressources: ... {NSDATA * DATA = [NSDATA DATAWITHCONTENTSOFURL: [[NSBUNDLE MAINBUNLEBUNLET] URLFORRESOURCE: @ "SAMPLE.M4V" WithEntension: @ ""]]; Nsurlreesponse * réponse = [[[Nsurlreesponse ALLOC] INITWITHURL: Self.url MIMETYPE: @ "Vidéo / x-m4v" attenduContentLength: [longueur de données] TextenCodageName: nil]; [LoadingRequest FinishloadingWithResponse: Données de réponse: Données Redirection: Nil]; retour oui; }



8
votes

J'ai mis en place une version de travail de cette méthode. Il m'a fallu un certain temps pour comprendre. Mais l'application résultante fonctionne maintenant. Ce qui suggère que le code est correct.

Mon application comprend un fichier multimédia que je ne voulais pas expédier dans le package non chiffré. Je voulais décrypter de manière dynamique le fichier. (un bloc à la fois).

La méthode doit répondre à la fois à la demande de contenu (indiquez au lecteur ce qu'elle est en cours de chargement) Et aux demandes de données (donnez au joueur certaines données). La première fois que la méthode est appelée, il y a toujours une demande de contenu. Ensuite, il y aura une série de demandes de données.

Le joueur est gourmand. Il demande toujours tout le dossier. Vous n'êtes pas obligé de fournir cela. Il demande tout le gâteau. Vous pouvez lui donner une tranche.

Je maintiens les blocs de lecteur multimédia de données. Habituellement, 1 Mo à la fois. Avec un cas particulier pour gérer le plus petit bloc final. Les blocs sont généralement demandés en séquence. Mais vous devez également être capable de faire face à des demandes hors de séquence. xxx


2 commentaires

Bonjour, j'ai une sorte de mise en œuvre similaire, mais je suis confronté à un problème parfois tout en frottant la vidéo. Parfois, des pixels vidéo ou apparaissent verts lorsque nous frottons. Avez-vous rencontré des problèmes similaires?


J'ai eu mon application pour être stable. Mais l'application n'a pas nécessité de récurer. J'étais un peu incertain de la façon de conduire le code CCCrypto.



1
votes

Utilisateur Nsurlcomponent avec le schéma = "ENC" afin d'appeler la méthode AvastreSourCeloaderDelegate. xxx


0 commentaires