ios中音视频录制,以及 压缩

音频录制

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(@"导出完成");
    }];

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值