SetSource MediaElement с использованием пользовательского потока, наследуемого от IsolatedStorageFileStream - PullRequest
2 голосов
/ 02 августа 2011

У меня есть класс с именем XorIsoStoreFileStream, унаследованный от IsolatedStorageFileStream, и дело в том, что при использовании этого класса материал записывается с использованием «шифрования» XOR, и его также можно прочитать с помощью этого класса, когда он возвращает XOR.Например:

public override int Read( byte[] buffer, int offset, int count )
{
    int startbyte = (int)base.Position;
    int readlength = base.Read( buffer, offset, count );
    xor( startbyte, buffer );

    return readlength;
}

Кажется, что это работает хорошо везде в программе.Теперь мне нужно воспроизвести mp3-файл оттуда, и из-за переопределенных Read и ReadByte он должен работать так же, как если бы я дал SetSource IsolatedStorageFileStream.Это не займет мой класс Xor, хотя.Когда я нажимаю на play, он встречает NotSupportedException в строке SetSource, говоря: «Поток должен иметь тип IsolatedStorageFileStream».

using( var appStorage = IsolatedStorageFile.GetUserStoreForApplication() )
{
    if( appStorage.FileExists( path ) )
    {
        using( var stream = new XorIsoStoreFileStream( path, FileMode.Open, appStorage ) )
        {
            App.MainAudioPlayer.SetSource( stream );  // how to put Xor stream here?
        }
    }
}

Есть ли что-то еще, что я могу переопределить, например сам SetSource?Кажется, это не поможет.
Нужно ли мне реализовывать MediaStreamSource?Это кажется огромным излишним, изобретением велосипеда и т. Д.
Или это просто не сработает?Придется ли мне сохранять дешифрованные части файла во временном месте, а SetSource - в обычном IsolatedStorageFileStream?

1 Ответ

0 голосов
/ 02 августа 2011

Вы можете использовать MediaStreamSource, но это займет довольно много времени.В вашем случае было бы намного проще обработать экземпляр IsolatedStorageFileStream непосредственно перед воспроизведением и передать его в MediaElement вместо переопределения и передачи пользовательского класса.

У вас будут проблемы с передачей пользовательских классов, поскольку вам нужно использовать нативный IsolatedStorageFileStream, чтобы передать его через SetSource, как указано в официальном документе .

Передача общего потока в SetSource (System.IO.Stream) не поддерживается в Silverlight для Windows Phone.Однако класс IsolatedStorageFileStream, производный от Stream, поддерживается в Silverlight для Windows Phone.

...