音频录制
1.导入库
AVFoundation.framwork
2.创建一个管理类
@property (strong, nonatomic) AVAudioRecorder *recorder;
3.创建文件保存路径
NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"mymusic.mp3"]
4.保存声音格式,以及位深,采样频率,及声道数
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"mymusic.mp3"];
//声音压缩原理
// 声音原始格式: PCM 原始数据 -> wav格式
// 采样频率
// 位深度
// 声道 -> 2个音轨
// PCM 最终的文件大小: PCM数据头 头字节 + 时间(秒) * 采样频率 * 位深度/8 * 声道
// 对原始声音进行压缩
// 从原始数据 -> 压缩后的数据 编码(软编码,硬编码)
// 从压缩后的数据 -> 原始数据 解码(软解码,硬解码)
// 对原始数据进行压缩后格式
// 有损压缩 acc,mp3(mpeg3)
// 无损压缩 flac,
// aac格式 压缩格式 , acc,mp3
// aac格式苹果支持的,硬件支持
// 有坑: 苹果不支持MP3录制,但是苹果支持MP3播放,aac格式录制
// 播放: MP3硬件加速
// acc格式录制 -> 公司有要求需要MP3数据
// 第三方 -> C语言库 -> 必须需要了解PCM数据格式
// 获取 (acc) -> PCM -> C语言库转成对应文件(mp3)
// 推荐几个音频库,lame库(MP3),speex库(做有损音频压缩 -> 降噪,去杂音),比较庞大的多媒体框架 ffmpeg(音视频)
NSDictionary *settings = @{
AVFormatIDKey:@(kAudioFormatMPEGLayer3),
AVLinearPCMBitDepthKey:@(8), // 位深度
AVSampleRateKey:@(8000),
AVNumberOfChannelsKey:@(1)
};
self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];
}
5.在按钮点击事件中实现 开始录音和结束录音
- (IBAction)actionBeginRecord:(id)sender {
[self.recorder record];
}
- (IBAction)actionEndRecord:(id)sender {
[self.recorder stop];
}
实现录音播放,原理就是创建一个播放类,通过上面保存的路径来读取相应的文件,实现play 方法,在这里就不多说了.
视频录制
- 视频录制原理图:
- 这里的视频录制,就需要结合声音,和图像进行混合录制.
1.根据上面的原理图我们首先创建已下几个属性
//声音 图像输入
@property (strong, nonatomic) AVCaptureInput *videoInput;
@property (strong, nonatomic) AVCaptureInput *audioInput;
//会话层
@property (strong, nonatomic) AVCaptureSession *session;
//输出层
@property (strong, nonatomic) AVCaptureMovieFileOutput *output;
2.将创建的输入,输出对象加入到session层
- (void)viewDidLoad {
[super viewDidLoad];
// 创建摄像头设备对象
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// 通过摄像头创建一个图像输入
self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
// 创建一个麦克风设备对象
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
// 通过声音设备对象创建输入
self.audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
// 创建输出
self.output = [AVCaptureMovieFileOutput new];
// 创建session
self.session = [AVCaptureSession new];
// 关联输入和输出
if([self.session canAddInput:self.videoInput]) {
[self.session addInput:self.videoInput];
}
if([self.session canAddInput:self.audioInput]) {
[self.session addInput:self.audioInput];
}
if([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
//创建预览
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
previewLayer.frame = self.view.bounds;
[self.view.layer insertSublayer:previewLayer atIndex:0];
// 开启
[self.session startRunning];
}
3.我们在开始录制的事件里创建文件保存路径(输出路径),并进行录制
注意我们在创建输出对象的时候需要遵守<AVCaptureFileOutputRecordingDelegate>
协议,并实现其协议方法
- (IBAction)actionBeginRecord:(id)sender {
// outputFileURL 输出路径
// AVCaptureFileOutputRecordingDelegate
NSURL *outURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask
] lastObject] URLByAppendingPathComponent:@"test.mov"];
[self.output startRecordingToOutputFileURL:outURL recordingDelegate:self];
}
//实现协议方法
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {
// 录制完成以后,因为很大,所以应该降低分辨率变小 -> 压缩
NSLog(@"录制完成");
// 创建导出的session
// 导出的源数据
AVAsset *asset = [AVAsset assetWithURL:outputFileURL];
// .m4a
// 第一个参数表示导出资源的源路径
// 第二个参数表示导出的资源的质量 -> 声音压缩方式(压缩算法 aac),视频的压缩方式(压缩格式/压缩算法,h.264),视频的宽和高(分辨率),考虑帧率,
// 视频压缩考虑这个几个方面:
// 声音压缩考虑方向:声道,位深,采样率,压缩算法
// 视频压缩考虑方向:视频图像宽高,帧率,压缩算法
// 压缩方式(压缩算法 / aac),视频的压缩方式(压缩格式/压缩算法,h.264),视频的宽和高(分辨率),考虑帧率,
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetLowQuality];
// 设置输出路径?,输出格式?
exportSession.outputURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"export.m4a"];
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
// 开始导出
[exportSession exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"导出完成");
}];
}