Xamarin 表单视频缩略图:尝试在 IOS 13.1.3 设备上创建视频缩略图表单本地存储时出错
Posted
技术标签:
【中文标题】Xamarin 表单视频缩略图:尝试在 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 【发布时间】:2020-04-03 00:50:21 【问题描述】:有人可以帮我解决这个问题吗?
我正在尝试从使用 MediaPlugin 保存/创建的视频创建缩略图。我返回的路径是
/var/mobile/Containers/Data/Application/ApplicationID/Documents/Videos/name 视频.MOV
但每次我尝试这个 URL 时,它都会返回一个错误,提示“文件路径不存在..”
我尝试附加“filepath:///”、“file:///”和“file:///private”。这些都不起作用。我的网址有什么问题?我知道该视频存在并且我拥有对我的 iPhone 文件系统的完全访问权限(权限)。
我正在使用的代码:
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 上运行
【问题讨论】:
试试AVAsset.FromUrl(NSUrl.FromFilename())
@E75 你好,你解决了吗?我已经分享了我的答案,你有时间可以看看。
【参考方案1】:
在 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);
【讨论】:
以上是关于Xamarin 表单视频缩略图:尝试在 IOS 13.1.3 设备上创建视频缩略图表单本地存储时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用啥控件从相机捕获图像并在 ui 上显示为带有事件 xamarin ios 的缩略图