2017-04-23 63 views
0

我與按鈕的Click事件中方法的網頁上的按鈕:MediaTranscoder.PrepareFileTranscodeAsync UnauthorizedAccessException

StorageFile _sourceFile;  
private string _sourceToken; 
private async void btnSelect_Click(object sender, RoutedEventArgs e) 
{ 
    FileOpenPicker fop = new FileOpenPicker(); 
    fop.FileTypeFilter.Add(".mp4"); 

    StorageFile inFile = await fop.PickSingleFileAsync(); 
    _sourceToken = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(inFile); 

    _sourceFile = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(_sourceToken); 
    mediaElement.AutoPlay = false; 
    IRandomAccessStream stream = await _outFile.OpenAsync(FileAccessMode.ReadWrite); 
    mediaElement.SetSource(stream, _outFile.ContentType); 

} 

如果我點擊MediaElement的發揮我選擇正常播放視頻。

我也有另外一個按鈕,它有它的單擊事件下面的代碼:

private async void btnExport_Click(object sender, RoutedEventArgs e) 
{ 
    StorageFile outFile = await KnownFolders.VideosLibrary.CreateFileAsync("Outfie.mp4", CreationCollisionOption.ReplaceExisting); 

    MediaEncodingProfile profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p); 

    MediaTranscoder transcoder = new MediaTranscoder(); 

    PrepareTranscodeResult prepareOp = await transcoder.PrepareFileTranscodeAsync(_sourceFile, outFile, profile); 

    if (prepareOp.CanTranscode) 
    { 
     var transcodeOp = prepareOp.TranscodeAsync(); 

     transcodeOp.Progress += new AsyncActionProgressHandler<double>(TranscodeProgress); 
     transcodeOp.Completed += new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete); 
    } 
    else 
    { 
     switch (prepareOp.FailureReason) 
     { 
      case TranscodeFailureReason.CodecNotFound: 
       System.Diagnostics.Debug.WriteLine("Codec not found."); 
       break; 
      case TranscodeFailureReason.InvalidProfile: 
       System.Diagnostics.Debug.WriteLine("Invalid profile."); 
       break; 
      default: 
       System.Diagnostics.Debug.WriteLine("Unknown failure."); 
       break; 
     } 
    } 
} 

不幸的是,線transcoder.PrepareFileTranscodeAsync拋出UnauthorizedAccessException。但是,如果我改用以下_sourceFile的工作原理:

StorageFile sourceFile = await KnownFolders.VideosLibrary.GetFileAsync("sourceFile.mp4"); 

被拋出的錯誤是:

System.UnauthorizedAccessException的:「訪問被拒絕。 (從HRESULT異常:0X80070005(E_ACCESSDENIED))」

爲了清楚起見,我選擇文件OUTSIDE的KnownFolders枚舉,因此我使用Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList。

任何人都可以解釋爲什麼嗎?

編輯: 如果我將源文件更改爲FileOpenPicker的結果,那麼它的工作原理。所以它引發了一個問題,爲什麼FutureAccessList無法正常工作?

private async void btnExport_Click(object sender, RoutedEventArgs e) 
{ 
    StorageFile outFile = await KnownFolders.VideosLibrary.CreateFileAsync("Outfie.mp4", CreationCollisionOption.ReplaceExisting); 

    FileOpenPicker fop = new FileOpenPicker(); 
    fop.SuggestedStartLocation = PickerLocationId.ComputerFolder; 
    fop.FileTypeFilter.Add(".mp4"); 

    StorageFile sourceFile = await fop.PickSingleFileAsync(); 

    MediaEncodingProfile profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p); 

    MediaTranscoder transcoder = new MediaTranscoder(); 

    PrepareTranscodeResult prepareOp = await transcoder.PrepareFileTranscodeAsync(sourceFile, outFile, profile); 

    if (prepareOp.CanTranscode) 
    { 
     var transcodeOp = prepareOp.TranscodeAsync(); 

     transcodeOp.Progress += new AsyncActionProgressHandler<double>(TranscodeProgress); 
     transcodeOp.Completed += new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete); 
    } 
    else 
    { 
     switch (prepareOp.FailureReason) 
     { 
      case TranscodeFailureReason.CodecNotFound: 
       System.Diagnostics.Debug.WriteLine("Codec not found."); 
       break; 
      case TranscodeFailureReason.InvalidProfile: 
       System.Diagnostics.Debug.WriteLine("Invalid profile."); 
       break; 
      default: 
       System.Diagnostics.Debug.WriteLine("Unknown failure."); 
       break; 
     } 
    } 
} 

回答

1

你有權訪問你正在嘗試寫入的文件嗎?也許它是隻讀的或由另一個用戶創建的而不是你自己? (右鍵單擊資源管理器中文件的屬性應該會給你一個更清晰的文件權限圖片)

另外,如果您嘗試寫入到您無權訪問的文件夾。

檢查您的憑據,我想這是與此有關的東西。

+0

同意絕對是一個權限問題,但要注意以下行: IRandomAccessStream流=等待_outFile.OpenAsync(FileAccessMode.ReadWrite); 當我在第一個實例中沒有權限時會失敗。 –

+0

如果您沒有權限,爲什麼它不會失敗?你要求訪問讀/寫你不允許修改它的文件。 –

+0

我的觀點是我有權限。如果我沒有權限,我將無法首先執行要求讀/寫的OpenAsync。 –

1

這樣看來其實我打開源文件中的讀寫模式

IRandomAccessStream stream = await _outFile.OpenAsync(FileAccessMode.ReadWrite); 

當時的問題的原因。據this

使用讀/寫模式,只有當你準備好立即寫爲了以避免與其他操作的衝突。

所以我改變了這個和一切運作良好

IRandomAccessStream stream = await _outFile.OpenAsync(FileAccessMode.Read); 
+0

很高興看到你已經解決了這個問題你自己:) –

+1

感謝您保持感興趣:) –

相關問題