Использование IMFSourceResolver :: CreateObjectFromByteStream - PullRequest
0 голосов
/ 19 июля 2010

Я пытаюсь использовать метод IMFSourceResolver :: CreateObjectFromByteStream для создания экземпляра IMFMediaSource для файла WMA с защитой DRM. Я адаптирую образец ProtectedPlayback из Windows SDK в качестве игровой площадки. Конечная цель, которую я хочу достичь, состоит в том, чтобы процесс воспроизведения подпитывался пользовательской реализацией, если IMFByteStream, который я напишу.

Однако я не могу заставить работать мою простую реализацию IMFByteStream или реализации, возвращаемые функцией MFCreateFile. Каждый возвращает HRESULT MF_E_UNSUPPORTED_BYTESTREAM_TYPE при передаче в CreateObjectFromByteStream.

Я протестировал образец проекта в его состоянии по умолчанию (используя CreateObjectFromUrl для файла) с файлом WMA, защищенным DRM, и он работал нормально. Файл не поврежден и лицензия действительна. Я не понимаю, почему замена этого бита кода с CreateObjectFromByteStream (MFCreateFile ()) не работает. Мне удалось найти небольшую документацию, которая описывает использование пользовательских потоков байтов или то, что распознаватель ожидает от экземпляра потока байтов.

Если у кого-то есть опыт работы с этим материалом или какая-либо идея, что я делаю неправильно, некоторые указатели будут признательны.

Код, который я использую здесь:

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));

Я не включил все это, потому что это в основном то же самое, что и образец, я только изменил эту часть.

Спасибо

Steve

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

@ pisomojado

Спасибо за ответ, я полностью забыл, что опубликовал этот вопрос.

Проблема заключалась в том, что, если я правильно помню, CreateObjectFromByteStream нужен способ определения типа содержимого,Вы можете сделать это, передав URL-адрес, а также экземпляр байтового потока (параметр pwszURL) или заставив класс байтового потока реализовать IMFAttributes и обработать вызов GetAllocatedString, который запрашивает тип контента.Поскольку я не делал ничего из этого, распознаватель просто отклонял поток.

Я бы подумал, что распознаватель попытается распознать тип содержимого потока через первые несколько байтов, как вы предложили в своем ответе,но для меня это не похоже на это.Не уверен, почему это так, но не важно.

Стив

1 голос
/ 24 августа 2010

Некоторые идеи для отладки того, что здесь происходит:

Прежде всего, сделайте IMFSourceResolver::CreateObjectFromUrl в вашем файле c: \ ifb.wma; убедитесь, что счастлив.

Предполагая, что это так, можно приступить к рассмотрению того, что происходит в вашем IMFByteStream во время вызова CreateObjectFromByteStream. Как правило, CreateObjectFromByteStream будет пытаться прочитать пару байтов от начала IMFByteStream, поскольку там обычно есть какая-то последовательность идентифицирующих байтов. Установите некоторые контрольные точки или выполните регистрацию со своего IMFByteStream::[Begin]Read, чтобы увидеть, что вас просят, и верно ли вы доставляете правильные байты.

FWIW, все файлы WMA (и WMV, и ASF) начинаются так (это GUID заголовка ASF).

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