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 的缩略图

ios获取本地视频第一帧,缩略图

如何使用适用于 Android 和 iOS 的 Xamarin 表单在特定频道上的 youtube 上上传视频?

如何从服务器创建视频网址的缩略图

目录中的视频缩略图

Xamarin表单:ios平台上的webview中视频未完全填充