【问题标题】:Xamarin Forms MediaSource not loading from local fileXamarin Forms MediaSource 未从本地文件加载
【发布时间】:2020-10-20 21:07:47
【问题描述】:

我正在尝试使用 MediaElement 在 Xamarin Forms 应用程序中显示视频。第一次打开特定视频时,它将使用 MediaSource.FromUri(); 从 Internet 检索视频。然后我会将视频写入本地文件系统,以便下次用户尝试打开视频时可以在本地检索视频。从互联网加载视频时,一切正常,但我无法从本地文件系统正确加载。我用 MediaSource.FromFile() 和 MediaSource.FromUri() 都试过了,但是没有视频,页面一直是黑色的。

这是相关的 XAML 代码:

<MediaElement Source="{Binding MediaSource}" ShowsPlaybackControls="True" Aspect="AspectFit" />```

我的ViewModel的代码(也就是页面的BindingContext):

public class VideoPlayerViewModel : BaseViewModel
    {
        public string VideoUrl { get; set; }

        private MediaSource mediaSource;

        public MediaSource MediaSource
        {
            get => mediaSource;
            set
            {
                mediaSource = value;

                OnPropertyChanged();
            }
        }

        /// <summary>
        /// Initializes this instance.
        /// <para>Sets IsInitialized to true</para>
        /// </summary>
        public override async void Init()
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(VideoUrl))
                {
                    string videoUrl = $"{Constants.VideoBaseUrl}{VideoUrl}";

                    string videoFilename = Path.GetFileName(videoUrl);

                    string videoCacheDirectory = Path.Combine(FileSystem.AppDataDirectory, Constants.VideoCacheDirectory);
                    string videoFilePath = Path.Combine(videoCacheDirectory, videoFilename);

                    if (!File.Exists(videoFilePath))
                    {
                        MediaSource = MediaSource.FromUri(new Uri(videoUrl));

                        await CacheVideoAsync(videoUrl, videoFilePath);
                    }
                    else
                        MediaSource = MediaSource.FromFile(videoFilePath); //   MediaSource = MediaSource.FromUri(new Uri()); // 
                }
            }
            catch
            {

            }

            base.Init();
        }

        private static async Task CacheVideoAsync(string videoUrl, string videoFilePath)
        {
            try
            {
                CreateCacheDirectoryIfNotExists();

                using (HttpResponseMessage response = await Statics.AppHttpClient.GetAsync(videoUrl))
                using (Stream videoStream = await response.Content.ReadAsStreamAsync())
                using (FileStream outputStream = File.Create(videoFilePath))
                {
                    await videoStream.CopyToAsync(outputStream);
                }
            }
            catch (Exception ex)
            {
            }
        }

        private static void CreateCacheDirectoryIfNotExists()
        {
            string videoCacheDirectory = Path.Combine(FileSystem.AppDataDirectory, Constants.VideoCacheDirectory);

            if (!Directory.Exists(videoCacheDirectory))
                Directory.CreateDirectory(videoCacheDirectory);
        }
    }

谁能告诉我我做错了什么?

【问题讨论】:

  • 您是否添加了读写文件的权限?
  • 是的,我已经在应用程序的其他部分读写文件,它们工作正常。

标签: c# .net xamarin xamarin.forms


【解决方案1】:

尝试添加CrossFilePicker 并将源设置为 mediaElement.Source = MediaSource.FromUri(filePath);

        FileData fileData = await CrossFilePicker.Current.PickFile();
        if (fileData == null)
            return; // user canceled file picking

        string fileName = fileData.FileName;
        string contents = System.Text.Encoding.UTF8.GetString(fileData.DataArray);

        var Items = GetItems();
        mediaElement.Source = MediaSource.FromFile(fileData.FilePath);//Items[0].FilePath

并且还要在xaml中指定元素的名字

<Grid>
    <xct:MediaElement x:Name="mediaElement"
                      Grid.Row="0"
                      AutoPlay="False"
                      ShowsPlaybackControls="True" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多