【发布时间】: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