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);
}