隐藏字幕解决错误System.UnauthorizedAccessException

时间:2016-05-02 19:57:16

标签: c# win-universal-app

所以,我正在尝试对我的UWP视频播放器(使用MediaElement)实施隐藏式字幕支持,我已经按照example这样做了。

我在解析它时遇到一个名为"Error resolving track due to error NetworkError System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"

的错误

我是这样做的:我使用filepicker打开一个文件,然后获取所选视频的SRT。之后我展示了它。不幸的是,没有出现。

这是我的OpenButton功能:

 private async void BtnOpenMedia_Click(object sender, RoutedEventArgs e)
    {
        FileOpenPicker filePicker = new FileOpenPicker();
        filePicker.ViewMode = PickerViewMode.Thumbnail;
        filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
        filePicker.FileTypeFilter.Add(".mp4");
        filePicker.FileTypeFilter.Add(".wmv");
        filePicker.FileTypeFilter.Add(".mpg");
        filePicker.FileTypeFilter.Add(".mpeg");
        filePicker.FileTypeFilter.Add("*");

        StorageFile storageFile = await filePicker.PickSingleFileAsync();

        if (storageFile != null && mElement != null)
        {
            string strSource = Path.GetDirectoryName(storageFile.Path) + @"\" + storageFile.DisplayName + ".srt";

            var mediaSource = MediaSource.CreateFromStorageFile(storageFile);

            var ttsStream = TimedTextSource.CreateFromUri(new Uri(strSource));

            ttsStream.Resolved += TtsStream_Resolved;

            mediaSource.ExternalTimedTextSources.Add(ttsStream);

            var mediaPlayback = new MediaPlaybackItem(mediaSource);

            mElement.SetPlaybackSource(mediaPlayback);
        }
    }

这是我的解决功能:

private void TtsStream_Resolved(TimedTextSource sender, TimedTextSourceResolveResultEventArgs args)
    {
        if (args.Error != null)
        {
            var ignoreAwaitWarning = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                var msg = new MessageDialog("Error resolving track " + " due to error " + args.Error.ErrorCode + "  " + args.Error.ExtendedError);
                await msg.ShowAsync();
            });
            return;
        }
    }
P.S:另外,我不知道这是否重复,这就是为什么我在这里添加它但我已经完成了我的研究而没有发现任何东西。如何预览MediaElement的框架?例如像YouTube一样,您可以在滑块中预览缩略图,我不知道如何实现这一点,谢谢!

1 个答案:

答案 0 :(得分:0)

您使用FileOpenPicker选择视频文件,但使用路径访问.srt文件。 .srt文件也位于视频文件的文件夹中。我在这里转载你的问题:

enter image description here

错误消息是明确的,您无权访问此文件,此文件指示.srt文件,因此问题在于您存储此.srt文件的位置。只是进行测试,似乎TimedTextSource.CreateFromUri(Uri) | createFromUri(Uri) method不支持访问本地计算机中的文件,但您可以使用TimedTextSource.CreateFromStream(IRandomAccessStream) | createFromStream(IRandomAccessStream) method,例如:

if (storageFile != null && mElement != null)
{
    //string strSource = Path.GetDirectoryName(storageFile.Path) + @"\" + storageFile.DisplayName + ".srt";
    var fileSource = await KnownFolders.VideosLibrary.GetFileAsync(storageFile.DisplayName + ".srt");
    IRandomAccessStream strSource = await fileSource.OpenReadAsync();

    var mediaSource = MediaSource.CreateFromStorageFile(storageFile);
    //var ttsStream = TimedTextSource.CreateFromUri(new Uri(strSource));
    var ttsStream = TimedTextSource.CreateFromStream(strSource);

    ttsStream.Resolved += TtsStream_Resolved;

    mediaSource.ExternalTimedTextSources.Add(ttsStream);

    var mediaPlayback = new MediaPlaybackItem(mediaSource);

    mediaPlayback.TimedMetadataTracksChanged += (sender1, args) =>
    {
        mediaPlayback.TimedMetadataTracks.SetPresentationMode(0, TimedMetadataTrackPresentationMode.PlatformPresented);
    };

    mElement.SetPlaybackSource(mediaPlayback);
}

使用此代码时,.srt文件和视频文件应位于视频库和功能"视频库"应该在清单中启用。

在UWP应用程序中,您只能访问已知文件夹中的文件,如图片库,音乐库和视频库以及doc lib或应用程序的本地文件夹,如果您的视频不在这些文件夹中,您还应该处理在此方案中拒绝访问时的异常。

  

如何预览MediaElement的框架?例如,像YouTube一样,您可以在滑块中预览缩略图。

对于这个问题,我无法为您找到任何现成的样本,但我认为官方Media editing sample的方案4可以是一个方向,它在{{1}上显示一个覆盖层,也许你可以设置" baseVideoFile"和#34; overlayVideoFile"使用相同的来源。问题是何时何地显示此叠加层,它与MediaElement的传输控制有关。这只是一个想法,你可以尝试一下。