Не удалось скопировать поток в файл

Мне нужно создать аудиофайл из потока, создаваемого SpeechSynthesizer.

Это код am, использующий

var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);
            var reader = new Windows.Storage.Streams.DataReader(stream.GetInputStreamAt(0));
            await reader.LoadAsync((uint)stream.Size);

            byte[] bytes = new byte[stream.Size];
            reader.ReadBytes(bytes);

             var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

             using (var outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite))
             {

                 Stream os = outputStream.GetOutputStreamAt(0).AsStreamForWrite();
                 await os.WriteAsync(bytes, 0, bytes.Length);
             }

Я выяснил, что проблема заключалась в том, что на «os.WriteAsync» не ожидали. Когда я поставил точку останова в этой строке и подождал несколько секунд, тогда файл создавался должным образом. Не следует ли ожидать ожидание ключевого слова до тех пор, пока все байты не будут скопированы в поток до перехода к следующей строке?

Я не возражаю, если кто-нибудь может предложить лучший способ копирования InMemoryRandomAccessStream в файл?

РЕДАКТИРОВАТЬ:

Ответ Махантеша работает как шарм. Большое спасибо. Но я столкнулся с новой проблемой.

После создания файла попытаюсь открыть его снова, чтобы воспроизвести его, но я получаю эту ошибку.

«Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))»

Это мой код.

if (!cacheHit)
        {
            var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);

            //write the stream to disk (seems to be buggy when attempting to playback from the result of the speech synth request)
            var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

             outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite);

             await RandomAccessStream.CopyAsync(stream, outputStream);                 

        }

        //read agenda from disk and play back the audio
        var agendaStorageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(_AgendaAudioFilename);
        var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read);            

        _MediaPlayer.Url = text;
        _MediaPlayer.SetBytestream(agendaStreamFromDisk);
        _MediaPlayer.Play();    

Получаем ошибку на этой строке:

var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read);

Любая идея, что может пойти не так?

0
nl ja de

2 ответы

Я думаю, вы можете попробовать

await RandomAccessStream.CopyAsync(inMemoryStream, outputStream);

Решение новой проблемы:

if (!cacheHit)
    {
        var stream = await _SpeechSynth.GetSpeakStreamAsync(text, this.Language);

        //write the stream to disk (seems to be buggy when attempting to playback from the result of the speech synth request)
        var audioFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(_AgendaAudioFilename, CreationCollisionOption.ReplaceExisting);

         using(outputStream = await audioFile.OpenAsync(FileAccessMode.ReadWrite)){
         await RandomAccessStream.CopyAsync(stream, outputStream);}

    }

    //read agenda from disk and play back the audio
    var agendaStorageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(_AgendaAudioFilename);
   using (var agendaStreamFromDisk = await agendaStorageFile.OpenAsync(FileAccessMode.Read)){

    _MediaPlayer.Url = text;
    _MediaPlayer.SetBytestream(agendaStreamFromDisk);
    _MediaPlayer.Play();  }
1
добавлено
Необходимо закрыть выходной поток перед открытием в следующий раз (outputStream .Close) или попробовать «использовать» блоки
добавлено автор Mahantesh, источник
Большое спасибо за ответ. Но я сталкиваюсь с новой проблемой только дальше, когда пытаюсь открыть файл. Я отредактировал вопрос, не могли бы вы рассказать мне, где это может произойти неправильно?
добавлено автор Bitsian, источник

Поскольку вы используете ключевое слово await для ожидания, лучше использовать синхронные версии методов, например

using (var outputStream = audioFile.Open(FileAccessMode.ReadWrite))
{
    Stream os = outputStream.GetOutputStreamAt(0).AsStreamForWrite();
    os.Write(bytes, 0, bytes.Length);
}
0
добавлено
Даже это не работает ..... dunno y! Но когда я ставлю точку останова и подожду на следующей строке после os.Write в течение нескольких секунд, тогда выходной поток получит некоторый размер. Очень странно. Любая идея, что может произойти?
добавлено автор Bitsian, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot