2014-11-06 52 views
0

我想要做的就是讓用戶錄製他的聲音。錄音將存儲在本地存儲器中。用戶應該能夠播放錄音或用新的錄音進行替換。這就是我遇到麻煩的地方。替換Windows Phone 8.1中MediaElement中以前用於源的文件會拋出E_ACCSESSDENIED

情景A:還沒有錄音,這工作正常......當用戶按下錄音按鈕時,會採取這些步驟錄製音頻,然後將其設置爲媒體元素的來源。

// user starts recording by pressing a button 
// create file with replace option 
var audioStorageFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceIfExists);     
await mediaCapture.StartRecordToStorageFileAsync(audioEncodingProperties, audioStorageFile); 
// user stops recording... 
await mediaCapture.StopRecordAsync(); 
//... 
audioStream = await audioStorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read); 
MyMediaElement.SetSource(audioStream, audioStorageFile.ContentType); 

我可以重複這個過程多次,因爲我想和舊的音頻文件總是替換爲新的。

方案B:當我瀏覽的網頁,所以我想將其加載到MediaElement的時候了(的OnNavigatedTo事件)這樣

var audioStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(desiredName); 
audioStream = await audioStorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read); 
MyMediaElement.SetSource(audioStream, audioStorageFile.ContentType); 

記錄已經存在,所以用戶瀏覽頁面和文件已經加載到MediaElement。當用戶想要替換舊的錄音時,問題就開始了。這段代碼從方案A的代碼之前被稱爲:

MyMediaElement.Stop(); 
MyMediaElement.Source = null; 

當它到達線

var audioStorageFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceIfExists); 

UnauthorizedAccessException被拋出:訪問被拒絕。 (來自HRESULT的異常:0x80070005(E_ACCESSDENIED))。 似乎很清楚,拋出異常的原因是我試圖替換的文件正在使用中。但我不明白爲什麼以及如何避免它?任何人都可以發現我做錯了什麼嗎?謝謝。

回答

0

好的,事實證明問題實際上是我在將MediaElement添加到可視化樹之前設置了MediaElement的來源。我移動了代碼以將媒體源從OnNavigatedTo設置爲MediaElement.Loaded事件,並且問題解決了。我發現解決方案歸功於question

0

添加.Source = NULL創建文件

MyMediaElement.Source = null; 
var audioStorageFile = await folder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceIfExists);     

之前,如果在關閉的習慣不是/配置您的視頻流在完成後...你將有一個糟糕的時間。

爲了確保處置將被調用,使用using

的習慣設置讓您MediaElement像這樣

var audioStorageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("your_wav.wav"); 
using(Windows.Storage.Streams.IRandomAccessStream audio = await audioStorageFile.OpenAsync(FileAccessMode.Read)) 
{ 
    this.myMed.SetSource(audio, audioStorageFile.ContentType);     
} 

使用上面的方法,我可以記錄超過「your_wav .wav「,無論它是否已被設置爲媒體元素的來源。

+0

感謝您的回答。但是你的解決方案不適合我。當在使用語句中設置源時,MediaOpened事件不會觸發 - >似乎很合邏輯,因爲流在​​媒體打開之前被放置。取而代之的是'MediaFailed'事件被這個代碼觸發:'MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED:HRESULT - 0xC00D36C4'。看看這個[鏈接](http://stackoverflow.com/questions/19202386/windows-8-app-mediaelement-not-playing-wmv-files)。我認爲在這種情況下'MediaElement'應該負責關閉流。我試着在'MediaOpened'中自己這樣做,但沒有幫助 – stambikk 2014-11-07 08:49:22

+0

有趣的是,在我用'SetSource'設置源並且觸發'MediaOpened'事件之後,MediaElement.Source屬性是'null',儘管音頻是加載到MediaElement(我可以播放它) – stambikk 2014-11-07 09:28:33

+0

@stambikk我能夠播放文件就好了。不幸的是,我並不是在靠近開發計算機的地方將示例應用程序上傳到OneDrive。加上它是凌晨2點,我應該睡着:) – 2014-11-07 09:30:35

相關問題