项目中需要采集视频、照片、录音,并上传到服务器,这就需要读取这些文件流,照片和录音都很容易搞定。
视频有些麻烦,因为录制的视频被存到相册内,之后在FinishedPickingMedia里面不像照片可以通过下面代码直接得到
UIImage image = (UIImage)info.ObjectForKey(new NSString("UIImagePickerControllerOriginalImage"));
所以想到要不就直接去读取相册的文件,在模拟器内测试成功。
1: public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info)
2: {
3: //图片之前有方法读取了,这里主要是测试视频,下面是相册内的视频地址,很容易用代码得到的
4: //主要是在模拟器中选取视频,点击use后不能触发这个事件,不知道是不是模拟器的bug,所以固定下面视频地址,然后选择图片来执行下面代码
5: NSUrl referenceURL = new NSUrl("assets-library://asset/asset.mov?id=5F4A9F73-3542-469F-8DAD-BC2B53BFB40C&ext=mov");
6: if (referenceURL != null)
7: {
8: ThreadPool.QueueUserWorkItem(delegate
9: {
10: ALAssetsLibrary library = new ALAssetsLibrary();
11: library.AssetForUrl(referenceURL, (asset) =>
12: {
13: if (asset != null)
14: {
15: string filePath1 = Path.Combine(destPath, asset.DefaultRepresentation.Filename);
16: long size = asset.DefaultRepresentation.Size;
17: byte[] imgData = new byte[size];
18: NSError nsError;
19: IntPtr buffer = Marshal.AllocHGlobal(imgData.Length);
20: //拷贝ALAsset的一定字节到一个缓冲中
21: asset.DefaultRepresentation.GetBytes(buffer, 0, (uint)size, out nsError);
22: 吧缓冲写入到byte
23: Marshal.Copy(buffer, imgData, 0, imgData.Length);
24: //可以写成文件,或发送字节流等动作
25: File.WriteAllBytes(filePath1, imgData);
26: }
27:
28: }, (error) =>
29: {
30: if (error != null)
31: {
32: Console.WriteLine("错误: " + error.LocalizedDescription);
33: }
34: });
35: });
36: }
37: picker.DismissModalViewControllerAnimated(true);
38: }
作者:Bruce Lee
出处:http://www.cnblogs.com/BruceLee521
本博原创文章版权归博客园和本人共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出作者名称和原文连接,否则保留追究法律责任的权利。