Xamarin Forms 视频缩略图:尝试在 IOS 13.1.3 设备上从本地存储创建视频缩略图时出错
Xamarin Forms video thumbnail: Error occurring when trying to create video thumbnail form local storage on IOS 13.1.3 device
有人可以帮我解决这个问题吗?
我正在尝试使用 MediaPlugin 从视频 saved/created 创建缩略图。我返回的路径是
/var/mobile/Containers/Data/Application/{ApplicationID}/Documents/Videos/{name
of video}.MOV
但每次我尝试这个 URL 它 returns 一个错误说'文件路径不存在..'
我试过附加 'filepath:///'、'file:///' 和 'file:///private'。 None 这些作品。我的 URL 怎么了?我知道该视频存在并且我可以完全访问(许可)我的 iPhones 文件系统。
我使用的代码:
public ImageSource GenerateThumbImage(string url, long usecond)
{
AVAssetImageGenerator imageGenerator = new AVAssetImageGenerator(AVAsset.FromUrl((new Foundation.NSUrl(url))));
imageGenerator.AppliesPreferredTrackTransform = true;
CMTime actualTime;
NSError error;
CGImage cgImage = imageGenerator.CopyCGImageAtTime(new CMTime(usecond, 1000000), out actualTime, out error);
return ImageSource.FromStream(() => new UIImage(cgImage).AsPNG().AsStream());
}
注意:我使用的是 X.Forms 4.1 和 MediaPlugin 4.4.8.3(测试版)。 iPhone 是 运行 在 IOS 13.1.3
在 Xamarin Forms 中,您可以使用 Xamarin.Forms DependencyService 从原生 iOS 获取照片或文件。
创建一个 IThumbnailService 接口:
public interface IThumbnailService
{
Task<Stream> GetImageStreamAsync(string filePath);
}
在 ios 解决方案中,创建 ThumbnailService 类以从 ios 本地文件路径获取缩略图:
public class ThumbnailService : IThumbnailService
{
TaskCompletionSource<Stream> taskCompletionSource;
public Task<Stream> GetImageStreamAsync(string filePath)
{
CoreMedia.CMTime actualTime;
NSError outError;
using (var asset = AVAsset.FromUrl(NSUrl.FromFilename(filePath)))
using (var imageGen = new AVAssetImageGenerator(asset))
using (var imageRef = imageGen.CopyCGImageAtTime(new CoreMedia.CMTime(1, 1), out actualTime, out outError))
{
if (imageRef == null)
return null;
var image = UIImage.FromImage(imageRef);
//Stream imagestream = image.AsJPEG(1).AsStream();
Stream imagestream = image.AsPNG().AsStream();
taskCompletionSource.SetResult(imagestream);
}
return taskCompletionSource.Task;
}
}
最后,在ContentPage中显示:
Stream stream = await DependencyService.Get<IThumbnailService>().GetImageStreamAsync("VideoPath");
if (stream != null)
{
image.Source = ImageSource.FromStream(() => stream);
}
有人可以帮我解决这个问题吗?
我正在尝试使用 MediaPlugin 从视频 saved/created 创建缩略图。我返回的路径是
/var/mobile/Containers/Data/Application/{ApplicationID}/Documents/Videos/{name of video}.MOV
但每次我尝试这个 URL 它 returns 一个错误说'文件路径不存在..'
我试过附加 'filepath:///'、'file:///' 和 'file:///private'。 None 这些作品。我的 URL 怎么了?我知道该视频存在并且我可以完全访问(许可)我的 iPhones 文件系统。
我使用的代码:
public ImageSource GenerateThumbImage(string url, long usecond)
{
AVAssetImageGenerator imageGenerator = new AVAssetImageGenerator(AVAsset.FromUrl((new Foundation.NSUrl(url))));
imageGenerator.AppliesPreferredTrackTransform = true;
CMTime actualTime;
NSError error;
CGImage cgImage = imageGenerator.CopyCGImageAtTime(new CMTime(usecond, 1000000), out actualTime, out error);
return ImageSource.FromStream(() => new UIImage(cgImage).AsPNG().AsStream());
}
注意:我使用的是 X.Forms 4.1 和 MediaPlugin 4.4.8.3(测试版)。 iPhone 是 运行 在 IOS 13.1.3
在 Xamarin Forms 中,您可以使用 Xamarin.Forms DependencyService 从原生 iOS 获取照片或文件。
创建一个 IThumbnailService 接口:
public interface IThumbnailService
{
Task<Stream> GetImageStreamAsync(string filePath);
}
在 ios 解决方案中,创建 ThumbnailService 类以从 ios 本地文件路径获取缩略图:
public class ThumbnailService : IThumbnailService
{
TaskCompletionSource<Stream> taskCompletionSource;
public Task<Stream> GetImageStreamAsync(string filePath)
{
CoreMedia.CMTime actualTime;
NSError outError;
using (var asset = AVAsset.FromUrl(NSUrl.FromFilename(filePath)))
using (var imageGen = new AVAssetImageGenerator(asset))
using (var imageRef = imageGen.CopyCGImageAtTime(new CoreMedia.CMTime(1, 1), out actualTime, out outError))
{
if (imageRef == null)
return null;
var image = UIImage.FromImage(imageRef);
//Stream imagestream = image.AsJPEG(1).AsStream();
Stream imagestream = image.AsPNG().AsStream();
taskCompletionSource.SetResult(imagestream);
}
return taskCompletionSource.Task;
}
}
最后,在ContentPage中显示:
Stream stream = await DependencyService.Get<IThumbnailService>().GetImageStreamAsync("VideoPath");
if (stream != null)
{
image.Source = ImageSource.FromStream(() => stream);
}