ios-UI高级 相册的相关处理和音乐播放AVFoundation框架的内容总结

本文详细介绍iOS平台下多媒体处理的关键技术,包括图像加载、相册访问、音频播放等内容,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、相册和照片的处理
a)iOS图像加载方式
1. 相册——用户的相册资源,通过UIImagePickerController读取 
2. 应用程序包——与应用程序源文件同一目录,可通过文件路径读取 
3. 沙盒——沙盒目录即可以保存图片,也可以通过路径读取,读取方式和应用程序包的方式是一样的。
4. 因特网——通过URL从网络上下载图像读取。


2、图片加载
本地加载:
//程序包根路径
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
//图像路径
NSString *path = [resourcePath stringByAppendingPathComponent:@"my.png"];
网络加载:
NSURL *url = [NSURL URLWithString:@"http://www.qqmusic.com"]; 
// 网络获取数据
NSData *data = [NSData dataWithContentsOfURL:url];
// 将数据转成image
UIImage *image = [UIImage imageWithData:data];


3、相册访问
a) 相册资源访问通过UIImagePickerController类来读取。
b) UIImagePickerController类继承自UINavigationController,是个独立的导航控制器,一般使用模态窗口的方式弹出。
c) UIImagePickerController的sourceType属性的资源类型有以下三种:
   UIImagePickerControllerSourceTypePhotoLibrary  所有相册
   UIImagePickerControllerSourceTypeCamera 拍照 摄像
   UIImagePickerControllerSourceTypeSavedPhotosAlbum 细分时间相册
d) UIImagePickerController类的代理方法:(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info(图像选取必须实现UIImagePickerControllerDelegate协议,以监听选择的资源)


4、AVFoundation框架
a) AVFoundation是iOS中用于处理基于时间的媒体数据的高级框架;它是基于Core Audio、Core Media、Core Video等框架构建的。
b) iOS系统中的音频播放方式(这里只列举了最常用的两种方式)
AVAudioPlayer
使用简单方便,但只能播放本地音频,不支持流媒体播放 
AVPlayer
iOS4.0以后,可以使用AVPlayer播放本地音频和支持流媒体播放,但提供接口较少,处理音频不够灵活
注:使用以上两种播放方式时,都需要引用AVFoundation类
AVAudioPlayer方式示例
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"等你的季节" ofType:@"mp3"];
    //将该路径下的文件转成url格式
    NSURL *url = [NSURL fileURLWithPath:filePath];
    注意:这里的audioPlayer应该设置为全局变量,这样就不会在播放的时候被销毁
    audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];    
    
    //准备播放(作用是取得需要的音频硬件并且预加载Audio Queue的缓冲区)
    [audioPlayer prepareToPlay];
    //播放

    [audioPlayer play];


AVPlayer方式示例    
   //网络url
    NSURL *url = [NSURL URLWithString:@"http://www.baidumusic.com.mp3"];
    
    avPlayer = [[AVPlayer alloc]initWithURL:url];
    
    [avPlayer play];



好的,以下是使用 AVFoundation 框架开发一个能拍照并保存照片到相册iOS app demo 的步骤: 1. 创建一个新的 Xcode 项目,选择 Single View App 模板,并勾选 "Use SwiftUI" 选项。 2. 在 ContentView.swift 文件中,创建一个 preview 块,并添加一个 Button 视图。 3. 在 Button 的 action 中,调用一个名为 takePhoto 的函数。 4. 在 ContentView.swift 文件中,创建一个名为 CameraView 的自定义视图,并在其中导入 AVFoundation 框架。 5. 在 CameraView 中添加 AVCaptureSession、AVCapturePhotoOutput AVCaptureVideoPreviewLayer 属性。 6. 在 CameraView 的 init 方法中,配置 AVCaptureSession,并将 AVCaptureVideoPreviewLayer 添加到视图上。 7. 实现 takePhoto 函数,在其中调用 AVCapturePhotoOutput 的 capturePhoto 方法,并在 completionHandler 中将照片保存到相册中。 8. 在 ContentView 中,将 CameraView 添加为一个子视图,并设置其大小位置。 9. 运行项目,在模拟器或真机上测试拍照保存照片的功能。 以下是示例代码: ```swift import SwiftUI import AVFoundation import Photos struct ContentView: View { var body: some View { VStack { CameraView() .frame(width: 300, height: 300) Button("Take Photo") { takePhoto() } } } func takePhoto() { // TODO: Call takePhoto function in CameraView } } struct CameraView: UIViewRepresentable { private let captureSession = AVCaptureSession() private let photoOutput = AVCapturePhotoOutput() private let videoPreviewLayer = AVCaptureVideoPreviewLayer() func makeUIView(context: Context) -> UIView { let view = UIView(frame: .zero) configureCaptureSession() videoPreviewLayer.frame = view.layer.bounds view.layer.addSublayer(videoPreviewLayer) captureSession.startRunning() return view } func updateUIView(_ uiView: UIView, context: Context) { videoPreviewLayer.frame = uiView.layer.bounds } func configureCaptureSession() { guard let device = AVCaptureDevice.default(for: .video), let input = try? AVCaptureDeviceInput(device: device) else { return } if captureSession.canAddInput(input) { captureSession.addInput(input) } if captureSession.canAddOutput(photoOutput) { captureSession.addOutput(photoOutput) } videoPreviewLayer.session = captureSession } func takePhoto() { let settings = AVCapturePhotoSettings() photoOutput.capturePhoto(with: settings, delegate: self) } } extension CameraView: AVCapturePhotoCaptureDelegate { func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard let imageData = photo.fileDataRepresentation(), let image = UIImage(data: imageData) else { return } PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAsset(from: image) }) { (success, error) in if success { print("Photo saved to library") } else if let error = error { print("Error saving photo to library: \(error.localizedDescription)") } } } } ``` 注意:在运行项目之前,需要在 info.plist 文件中添加 "Privacy - Camera Usage Description" "Privacy - Photo Library Additions Usage Description" 权限描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值