5

再生機能を備えたオーディオレコーダーコントロールを作成しています。

media 要素を使用して、次のように録音した音声を再生します。

using (var storage = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
    using (System.IO.Stream stream = new System.IO.IsolatedStorage.IsolatedStorageFileStream(filePath, System.IO.FileMode.Open, storage))
    {
        player.SetSource(stream);
    }
}

私が直面している問題は、メディア要素を使用して録音したオーディオを再生するときです。ストリームはメディア要素にロックされています。SetSource()メソッドが例外をスローするため、ファイルを上書きしたり、再度再生したりすることはできません。

メディア要素にストリームを強制的に解放させる方法はありますか?

4

4 に答える 4

9

@Sheridanの回答に基づいて、これは私が思いついたものです。

関数のMediaElement使用を停止するたびに、プロパティを次のように設定します。Stop()Sourcenull

ResetMediaElement()
{
    mediaElement.Stop();
    mediaElement.Source = null;
}

これにより、メディア要素に関連付けられたストリームが閉じられるため、関連するリソースを別の場所で使用できます。

于 2013-10-11T12:42:43.953 に答える
2
mediaElement.Stop();
mediaElement.ClearValue(MediaElement.SourceProperty);
于 2015-12-06T04:51:00.380 に答える
0

画像の表示にも同様の問題がありました。画像のあるコントロールでは、ユーザーが画像を更新しようとするたびに「ファイルは使用中です」というエラーが表示されます。BitmapImage.CacheOption解決策は、プロパティをBitmapCacheOption.OnLoad次のように設定することでした。

MSDNによると、BitmapImage の作成に使用されたストリームを閉じたい場合は、CacheOption を BitmapCacheOption.OnLoad に設定してください。デフォルトの OnDemand キャッシュ オプションは、イメージが必要になるまでストリームへのアクセスを保持し、クリーンアップはガベージ コレクターによって処理されます。

に使用できる同様のプロパティを検索した後、MediaElement1 つも存在しないことが判明しました。ただし、MSDN からの mediaelement 投稿の chacheoption に関する回答によると、これを達成するための (長ったらしい) 方法があります...関連する回答から:

MediaElement が UserControl にあるかどうかはわかりません。ただし、どのような場合でも、UserControl または Control を IsEnabled=false に設定すると、イベント ハンドラー IsEnabledChanged がトリガーされます。その中に、MediaElement の再生を停止するために必要なコード ME.Stop() を配置し、ME.Clear() と ME.Source = null を呼び出します。その後、ソース ファイルを削除しても問題はありません。

ME.Source = new Uri(MediaFilePath);
ME.Play();
...
private void DeleteButton_Click(object sender, RoutedEventArgs e) 
{ 
    ME.IsEnabled = false;   // This will call the Event Handler IsEnabledChanged 
    System.IO.File.Delete(MediaFilePath); 
    // Now after the player was stopped and cleared and source set to null, it 
    // won't object to deleting the file
}

private void ME_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    ME.Stop();
    ME.Clear();
    ME.Source = null;
}

これが役立つことを願っています。

于 2013-10-10T12:31:55.703 に答える