微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin IOS - 从图库或相机中选取视频并在 CollectionViewCell 中显示

如何解决Xamarin IOS - 从图库或相机中选取视频并在 CollectionViewCell 中显示

我正在尝试使用 Xamarin 在 iOS 中显示从图库或相机胶卷中选取的视频。它适用于图像和文档 (iCloud),但对于视频你无法实现我的目标。

这是 gallery 的 UIImagePickerControllerDelegate:

public class UIgalleryMediaPickerDelegate : UIImagePickerControllerDelegate
{
    Action<string,string> onMediaPicked;

    public UIgalleryMediaPickerDelegate(Action<string,string> pOnMediaPicked)
    {
        onMediaPicked = pOnMediaPicked;
    }

    public override void FinishedPickingImage(UIImagePickerController pPicker,UIImage pImage,NSDictionary pInfo)
    {
        pPicker.dismissViewController(true,null);
    }

    public override void Canceled(UIImagePickerController pPicker)
    {
        pPicker.dismissViewController(true,null);
    }

    public override void FinishedPickingMedia(UIImagePickerController pPicker,NSDictionary pInfo)
    {
        PHAsset pHAsset = null;
        string filename = null;
        string extension = null;

        if (pInfo[UIImagePickerController.MediaType].ToString() == "public.image")
        {
            NSUrl imageUrl = null;

            if (UIDevice.CurrentDevice.CheckSystemVersion(11,0))
            {
                imageUrl = pInfo[UIImagePickerController.ImageUrl] as NSUrl;
                pHAsset = pInfo[UIImagePickerController.PHAsset] as PHAsset;
            }
            else
            {
                imageUrl = pInfo[UIImagePickerController.ReferenceUrl] as NSUrl;
                pHAsset = PHAsset.FetchAssets(new NSUrl[] { imageUrl },null).firstObject as PHAsset;
            }

            filename = ((Nsstring)pHAsset.ValueForKey(new Nsstring("filename"))).DeletePathExtension().ToString();
            extension = imageUrl.PathExtension;

            PCL.Storage.SaveImagetoFolder(pInfo[UIImagePickerController.OriginalImage] as UIImage,filename,PCL.storage.GetPrivateMediaFolder());
        }
        else
        {
            NSUrl videoUrl = null;

            videoUrl = pInfo[UIImagePickerController.MediaURL] as NSUrl;

            if (UIDevice.CurrentDevice.CheckSystemVersion(11,0))
            {
                pHAsset = pInfo[UIImagePickerController.PHAsset] as PHAsset;
            }
            else
            {
                pHAsset = PHAsset.FetchAssets(new NSUrl[] { videoUrl },null).firstObject as PHAsset;
            }

            filename = ((Nsstring)pHAsset.ValueForKey(new Nsstring("filename"))).DeletePathExtension().ToString();
            extension = videoUrl.PathExtension;

            PCL.Storage.SaveVideoToFolder(pInfo[UIImagePickerController.MediaURL] as NSUrl,PCL.storage.GetPrivateMediaFolder());
        }

        pPicker.dismissViewController(true,() => onMediaPicked?.Invoke(filename,extension));
    }
}

这是从相机取景时的委托

public class UICameraMediaPickerDelegate : UIImagePickerControllerDelegate
{
    Action<string,string> onMediaPicked;

    public UICameraMediaPickerDelegate(Action<string,NSDictionary pInfo)
    {
        string filename = Guid.NewGuid().ToString("N");
        string extension = null;

        if (pInfo[UIImagePickerController.MediaType].ToString() == "public.image")
        {
            PCL.Storage.SaveImagetoFolder(pInfo[UIImagePickerController.OriginalImage] as UIImage,PCL.storage.GetPrivateMediaFolder());
            extension = "JPEG";
        }
        else
        {
            PCL.Storage.SaveVideoToFolder(pInfo[UIImagePickerController.MediaURL] as NSUrl,PCL.storage.GetPrivateMediaFolder());
            extension = "MOV";
        }

        pPicker.dismissViewController(true,extension));
    }
}

如您所见,我将从图库或相机中挑选的所有视频和图像保存到应用程序私有存储中。然后是在 collectionview 单元格中显示视频的代码

Player = new AVPlayer(new AVPlayerItem(NSUrl.FromString(PCL.Storage.GetMediaFilenamePath(pMedia.Filename))));
            Player = new AVPlayer(NSUrl.FromString(PCL.Storage.GetMediaFilenamePath(pMedia.Filename)));
            PlayerLayer = AVPlayerLayer.FromPlayer(Player);
            PlayerLayer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill;
            PlayerLayer.Frame = videoContainerView.Frame;
            PlayerLayer.BackgroundColor = UIColor.Red.CGColor;
            videoContainerView.Layer.Sublayers = null;
            videoContainerView.Layer.AddSublayer(PlayerLayer);
            videoContainerView.Hidden = false;

我觉得很奇怪的是,当我从图库中选择视频时,文件名以“IMG”开头,这显然意味着图像......但我选择了一个视频......所以我真的不明白这一点。

以下调试器的屏幕截图显示了选择的文件。前4个是视频,后2个是图片

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。