问题描述
我正在尝试使用 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个是图片。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)