2017-04-23 3 views
0

J'ai un bouton sur une page avec la méthode suivante sur l'événement de clic du bouton: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); 

} 

Si je clique sur le jeu MediaElement la vidéo que je sélectionne joue bien.

J'ai aussi un autre bouton qui a le code suivant sur son événement click:

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; 
     } 
    } 
} 

Malheureusement, la ligne transcoder.PrepareFileTranscodeAsync jette un UnauthorizedAccessException. Mais si j'utilise les éléments suivants au lieu de _sourceFile cela fonctionne:

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

L'erreur est d'être jeté:

System.UnauthorizedAccessException: « L'accès est refusé. (Exception de HRESULT: 0x80070005 (E_ACCESSDENIED)) »

Pour être clair, je choisissais des fichiers en dehors du KnownFolders Enumeration, d'où je me sers Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.

Quelqu'un peut-il expliquer pourquoi?

EDIT: Si je change le fichier source pour être le résultat d'un FileOpenPicker alors cela fonctionne. Donc, il pose la question, pourquoi le FutureAccessList ne fonctionne pas?

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; 
     } 
    } 
} 

Répondre

1

Avez-vous accès au fichier que vous essayez d'écrire? Peut-être est-il en lecture seule ou créé par un autre utilisateur que vous? (Clic droit + Propriétés sur le fichier dans l'Explorateur devrait vous donner une image plus claire des autorisations de fichier)

Aussi, vous pourriez obtenir cette exception si vous essayez d'écrire dans un dossier auquel vous n'avez pas accès. .

Vérifiez vos informations d'identification, je suppose que c'est quelque chose lié à cela.

+0

D'accord certainement un problème d'autorisations, mais notez la ligne suivante: flux IRandomAccessStream = attendre _outFile.OpenAsync (FileAccessMode.ReadWrite); Qui échoue lorsque je n'ai pas la permission en première instance. –

+0

Pourquoi ne pas échouer si vous n'avez pas les autorisations? Vous demandez l'accès à lire/écrire un fichier que vous n'êtes pas autorisé à le modifier. –

+0

Mon point était que j'ai des permissions. Je ne serais pas en mesure d'exécuter l'OpenAsync exigeant en lecture/écriture en premier lieu si je n'avais pas les permissions. –

1

Il semble donc le fait que j'ouvrais le fichier source en mode ReadWrite

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

était la cause des problèmes. Selon la page this

Utilisez le mode de lecture/écriture uniquement lorsque vous êtes prêt à écrire immédiatement afin pour éviter les conflits avec d'autres opérations.

Je changé à cela et tout fonctionne bien

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

Heureux de voir que vous avez résolu cela par vous-même :) –

+1

Merci de rester intéressé :) –