iOS 音视频合成

作者: 轩辕小羽 | 来源:发表于2015-12-05 16:21 被阅读6671次

前言

因为最近做项目有遇到音视频合成的需求,但是网上的教程某些地方总是写的很模糊,所以自己调研完成之后决定写一篇博客分享出来,供大家一起学习进步

音视频主要是利用AVFoundation框架下的AVMutableComposition来合成音视频.
在AVMutableComposition中传入两个数据流,一个是音频一个是视频,之后调用合成方法就可以了


上代码

storyBoard中拖入一个button,一个imageView

这里写图片描述

为了效果好可以将IamgeView的背景色调为黑色

然后在ViewController中添加以下代码

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "MBProgressHUD+MJ.h"
@interface ViewController ()
/** 用于播放 */
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (IBAction)mergeAction:(UIButton *)sender {
    [self merge];
}
// 混合音乐
- (void)merge{
    // mbp提示框
    [MBProgressHUD showMessage:@"正在处理中"];
    // 路径
    NSString *documents = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    // 声音来源
    NSURL *audioInputUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"五环之歌" ofType:@"mp3"]];
    // 视频来源
    NSURL *videoInputUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"myPlayer" ofType:@"mp4"]];

    // 最终合成输出路径
    NSString *outPutFilePath = [documents stringByAppendingPathComponent:@"merge.mp4"];
    // 添加合成路径
    NSURL *outputFileUrl = [NSURL fileURLWithPath:outPutFilePath];
    // 时间起点
    CMTime nextClistartTime = kCMTimeZero;
    // 创建可变的音视频组合
    AVMutableComposition *comosition = [AVMutableComposition composition];
    
    
    // 视频采集
    AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:videoInputUrl options:nil];
    // 视频时间范围
    CMTimeRange videoTimeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
    // 视频通道 枚举 kCMPersistentTrackID_Invalid = 0
    AVMutableCompositionTrack *videoTrack = [comosition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    // 视频采集通道
    AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] firstObject];
    //  把采集轨道数据加入到可变轨道之中
    [videoTrack insertTimeRange:videoTimeRange ofTrack:videoAssetTrack atTime:nextClistartTime error:nil];
    
    
   
    // 声音采集
    AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioInputUrl options:nil];
    // 因为视频短这里就直接用视频长度了,如果自动化需要自己写判断
    CMTimeRange audioTimeRange = videoTimeRange;
    // 音频通道
    AVMutableCompositionTrack *audioTrack = [comosition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    // 音频采集通道
    AVAssetTrack *audioAssetTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
    // 加入合成轨道之中
    [audioTrack insertTimeRange:audioTimeRange ofTrack:audioAssetTrack atTime:nextClistartTime error:nil];
    
    // 创建一个输出
    AVAssetExportSession *assetExport = [[AVAssetExportSession alloc] initWithAsset:comosition presetName:AVAssetExportPresetMediumQuality];
    // 输出类型
    assetExport.outputFileType = AVFileTypeQuickTimeMovie;
    // 输出地址
    assetExport.outputURL = outputFileUrl;
    // 优化
    assetExport.shouldOptimizeForNetworkUse = YES;
    // 合成完毕
    [assetExport exportAsynchronouslyWithCompletionHandler:^{
        // 回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            // 调用播放方法
            [self playWithUrl:outputFileUrl];
        });
    }];
}

/** 播放方法 */
- (void)playWithUrl:(NSURL *)url{
    // 传入地址
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
    // 播放器
    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    // 播放器layer
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
    playerLayer.frame = self.imageView.frame;
    // 视频填充模式
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加到imageview的layer上
    [self.imageView.layer addSublayer:playerLayer];
    // 隐藏提示框 开始播放
    [MBProgressHUD hideHUD];
    [MBProgressHUD showSuccess:@"合成完成"];
    // 播放
    [player play];
}

MBP是一个第三方提示类,如果不关心这个功能可以删除这三行代码和头文件

// mbp提示框
    [MBProgressHUD showMessage:@"正在处理中"];
// 隐藏提示框 开始播放
    [MBProgressHUD hideHUD];
    [MBProgressHUD showSuccess:@"合成完成"];

效果图

因为是gif..请自己yy出Uber视频配上五环之歌(我感觉还挺配的)

这里写图片描述

GitHub:https://github.com/Lafree317/MergeVideoAndMusic

相关文章

  • iOS音视频合成

    前言 最近有个音频与视频,音频与音频合成的需求,正好做个记录,其实主要是用到了AVFoundation中的AVMu...

  • iOS 音视频合成

    #前言 ####因为最近做项目有遇到音视频合成的需求,但是网上的教程某些地方总是写的很模糊,所以自己调研完成之后决...

  • iOS 音视频合成

    前言 因为最近做项目有遇到音视频合成的需求,但是网上的教程某些地方总是写的很模糊,所以自己调研完成之后决定写一篇博...

  • iOS 图片合成视频(切换动画)

    多张图片合成视频(可切换动效)、音视频合成、多段音频合成、添加背景音乐、修改音视频音量 GitHub

  • iOS-音视频合成(混音)、多个视频合成为一个视频

    本文内容 1、多张图片合成视频 2、音视频合成 音视频合成主要分两种1.音频+无音频的视频2.音频+有音频的视频 ...

  • iOS音视频

    iOS 音视频开发(一)常用音视频框架介绍iOS 音视频开发(二)AVAudioRecorder录音、AVAudi...

  • iOS 音视频开发(一)常用音视频框架介绍

    文章规划iOS 音视频开发(一)常用音视频框架介绍(本篇)iOS 音视频开发(二)AVAudioRecorder实...

  • 关于 音频视频 合成

    音视频主要是利用AVFoundation框架下的 AVMutableComposition来合成音视频 在AVMu...

  • 图片资源音视频文件添加header防盗链Referer iOS

    flutter视频播放器 flutter图片资源 iOS 原生OC 音视频 iOS swift 音视频 iOS s...

  • iOS语音合成

    标签:ios语音合成 苹果公司在iOS7中推出了语音合成的技术,无需网络环境也可以实现语音合成。 iOS7语音合成...

网友评论

  • 暗尘随码去:请问为什么我的视频合成后变得非常模糊,原来5M的合成后变成了1M
  • SunnyLeong:你好,我合成后的视频,播放到最后有一段黑屏? 请问 楼主知道为何吗?
  • SunnyLeong:7P设备以上都不可使用 请大神解决
  • 不辣先生:AVCaptureMovieFileOutput 这个可以处理音视频录制,合成么
  • f170d29955a5:大神,两个视频首尾拼接成一个视频有demo吗?
  • Sias_Orange:如果2个视频 一个是横屏的 一个是竖屏的 合并后 会有一个视频旋转了(失真) 请问如何解决
  • cfa9294be3d1:有声的视频可以加入合成吗,我下载了你的demo,加入有声视频会报错...
  • 大强哥:你好,我想问下,怎么把多段音频合成到视频的特定时间段上
  • 巴图鲁:膜拜
  • 格调main:赞,收藏转发
  • 2ede4a8a7da0:请问楼主 我现在有一个需求是 比如我先自己清唱一端歌曲,完成后 我本地有一些伴奏 ,我需要把这个伴奏和我前面的清唱合成起来 生成一段新的音频 ,这种情况需要怎么做呢 。或者有没有相关资料
    2ede4a8a7da0:@轩辕小羽 你知道怎么设置混音音量吗
    轩辕小羽:@轩辕小羽 https://www.zhihu.com/question/26345756
    轩辕小羽:@Mr_hao demo是音轨和视频的合成,可以创建两个音轨的合成啊
  • 9b2ff9810bbe:楼主,我想问下我的音频合成后在模拟器上能成功,在真机上Error Domain=NSOSStatusErrorDomain Code=-16102 "(null)"}, NSLocalizedFailureReason=The operation is not supported for this media.,
    5a38f7481378:@guozai31 再检查下 合成时参数
  • gogo_coder:这个出来的效果是会把视频的声音覆盖掉对吧?可以设置叠加吗
    困惑困惑困惑:@gogo_coder 如何设置叠加呢
    gogo_coder:@轩辕小羽 嗯,找到用法了
    轩辕小羽:@gogo_coder 可以的 要混合音频
  • fcdc8375984e:为什么下载的demo运行不出来啊?
    peal:没有效果
    fcdc8375984e:@轩辕小羽 运行是没有问题,可是没有最终的效果,你是在模拟器上运行的吗?
    轩辕小羽:@雪归长安 我这里没问题啊
  • cd1fcb172f50:我最近也在研究。一起学习
  • Shumin_Wu:支持 先Mark
  • wtqhy14615:不错
  • 曾樑:这个好玩
    轩辕小羽:@曾樑 嘿嘿,研究了好久才弄出来的

本文标题:iOS 音视频合成

本文链接:https://www.haomeiwen.com/subject/oenshttx.html