2010-07-19 2 views
0

J'essaie d'utiliser la méthode IMFSourceResolver :: CreateObjectFromByteStream pour créer une instance IMFMediaSource pour un fichier WMA protégé par DRM. J'adapte l'exemple ProtectedPlayback du Kit de développement Windows en tant que terrain de jeu. L'objectif final que je souhaite atteindre est d'avoir le processus de lecture alimenté par une implémentation personnalisée si IMFByteStream que je vais écrire.Utilisation de IMFSourceResolver :: CreateObjectFromByteStream

Cependant, je ne peux pas utiliser mon implémentation IMFByteStream simple ou les implémentations retournées par la fonction MFCreateFile. Chaque renvoie un HRESULT de MF_E_UNSUPPORTED_BYTESTREAM_TYPE lorsqu'il est transmis à CreateObjectFromByteStream.

J'ai testé l'exemple de projet dans son état par défaut (en utilisant CreateObjectFromUrl sur un fichier) avec un fichier WMA protégé par DRM et cela a fonctionné correctement. Le fichier n'est pas corrompu et la licence est valide. Je ne comprends pas pourquoi substituer ce morceau de code avec CreateObjectFromByteStream (MFCreateFile()) ne fonctionne pas. J'ai pu trouver peu de documentation qui couvre l'utilisation de flux d'octets personnalisés ou ce que le résolveur attend d'une instance de flux d'octets.

Si quelqu'un a une expérience avec ce genre de choses ou une idée de ce que je fais mal, certains pointeurs seraient appréciés.

Le code J'utilise est ici:

IMFByteStream* stream = NULL; 

HRESULT hr2 = MFCreateFile(
    MF_ACCESSMODE_READ, 
    MF_OPENMODE_FAIL_IF_NOT_EXIST, 
    MF_FILEFLAGS_NONE, 
    L"C:\\IFB.wma", 
    &stream); 


CHECK_HR(hr = pSourceResolver->CreateObjectFromByteStream(
       stream, 
       NULL, 
       MF_RESOLUTION_MEDIASOURCE, 
       NULL, 
       &ObjectType, 
       &pSource)); 

Je n'ai pas inclus la chose parce que son fondamentalement les mêmes que l'échantillon, je n'ai changé cette partie.

Merci,

Steve

Répondre

2

@pisomojado

Merci pour la réponse, je suis totalement oublié que je l'avais posté cette question.

Le problème était, si je me souviens bien, que CreateObjectFromByteStream a besoin d'un moyen d'identifier le type de contenu. Vous pouvez le faire en transmettant une URL ainsi que l'instance de flux d'octets (paramètre pwszURL) ou en faisant en sorte que la classe de flux d'octets implémente IMFAttributes et gère l'appel à GetAllocatedString qui demande le type de contenu. Comme je ne faisais aucune de ces choses, le résolveur rejetait simplement le flux.

Je pensais que le résolveur essaierait de reconnaître le type de contenu de flux via les premiers octets comme vous l'avez suggéré dans votre réponse, mais pour moi, il ne semblait pas le faire. Je ne sais pas pourquoi c'est le cas, mais passons.

Steve

1

Quelques idées pour le débogage ce qui se passe ici:

Tout d'abord, faire une IMFSourceResolver::CreateObjectFromUrl sur votre fichier c: \ ifb.wma; assurez-vous que c'est heureux. En supposant que c'est le cas, alors il est à regarder ce qui se passe dans votre IMFByteStream lors de l'appel CreateObjectFromByteStream. En règle générale, CreateObjectFromByteStream va essayer de lire quelques octets au début de IMFByteStream, car il existe généralement une sorte de séquence d'octets d'identification. Définissez des points d'arrêt ou effectuez une journalisation à partir de votre IMFByteStream::[Begin]Read pour voir ce qui vous est demandé et si vous transmettez fidèlement les bons octets. FWIW, tous les fichiers WMA (et WMV et ASF) démarrent comme ceci (c'est le GUID de l'en-tête ASF).

30 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c