美文网首页
36.音轨合成

36.音轨合成

作者: 小笨憨 | 来源:发表于2018-03-08 16:28 被阅读0次

直接上代码了

class func coalescing(backFile:String,file:String,fromEarphone:Bool,complete:@escaping (_ url:String)->Void) -> Void {
        
        // 第一步,必须创建 AVMutableComposition ,类似于很多 api 这个后缀也为 composition, 意思可以理解为合成物,但不是最终生成d 文件
        let composition:AVMutableComposition = AVMutableComposition.init()
        // 一个音频轨道
        let appendedAudioTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)
        // 添加一个新的音频轨道
        let newAudioTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid)
        // 一个视频轨道
        let videoTrack = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid)
        
        // 此处创建的为音轨属性,可以理解为合成物所需要的原料,对音轨的加工都在这个方法里面进行,此处为音频合成 MediaType 为 AVMediaTypeAudio
        // 需求中背景 MV
        let backFileAsset = AVURLAsset.init(url: URL.init(fileURLWithPath: backFile))
        // 录制的音频
        let fileAsset = AVURLAsset.init(url: URL.init(fileURLWithPath: file))
        let start = CMTime.init(seconds: 0, preferredTimescale: fileAsset.duration.timescale)
        
        // 视频内容
        let mvTrack = backFileAsset.tracks(withMediaType: AVMediaType.video)[0]
        
        // 音轨
        let backTrack = backFileAsset.tracks(withMediaType: AVMediaType.audio)[0]
        let fileTrack = fileAsset.tracks(withMediaType: AVMediaType.audio)[0]
        // 根据录制时长来确定新的视频时长
        let timeRange = CMTimeRange.init(start: start, end: fileAsset.duration)
        do {
            try newAudioTrack?.insertTimeRange(timeRange, of: backTrack, at: kCMTimeZero)
            try appendedAudioTrack?.insertTimeRange(timeRange, of: fileTrack, at: kCMTimeZero)
            try videoTrack?.insertTimeRange(timeRange, of: mvTrack, at: kCMTimeZero)
        } catch let error {
            
            print("合成出错\(error)")
        }
        
        // 生成新的文件
        let exporSession = AVAssetExportSession.init(asset: composition, presetName: AVAssetExportPresetMediumQuality)
        
        if exporSession == nil {
            return
        } else {
            
            let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
            let path = String.init(format: "%@/NewMV", paths!)
            let fileManager = FileManager.default
            
            let exists = fileManager.fileExists(atPath: path, isDirectory: nil)
            if !exists {
                
                do {
                    try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
                } catch let error {
                    print("录音所在文件夹创建失败\(error)")
                }
            }
            let newPath = String.init(format: "%@/%@.mp4", path,String.getCurrentTimeName())
            
            exporSession?.outputURL = URL.init(fileURLWithPath: newPath)
            exporSession?.outputFileType    = AVFileType.mp4
            exporSession?.shouldOptimizeForNetworkUse   = true
            exporSession?.exportAsynchronously(completionHandler: {
                
                switch exporSession?.status {
                case .some(.completed):
                    print("完成")
                    complete(newPath)
                    break
                case .some(.failed):
                    print("失败")
                    
                    break
                case .some(.cancelled):
                    break
                default:
                    break
                }
            })
        }
    }

相关文章

  • 36.音轨合成

    直接上代码了

  • iOS音轨合成

    需求是录音+bgm,用AVMutableComposition创建录音和bgm的轨道(AVMutableCompo...

  • 分享个专业录音工具

    分享个专业音频编辑制作软件:Cooledit 2.0,可以支持多音轨编辑,耳麦或者系统声音录制,音频裁剪、合成。以...

  • 音轨

    “就如同,你知道音乐它有没有感情呢?” “音乐没有感情,感情是由音乐引导出来的。” “那为什么,你会有感情呢?” ...

  • 04_MoviePy混合剪辑_中文文档

    目录 视频合成,也称为非线性编辑,是在新剪辑中一起播放多个剪辑的事实。 开始之前,请注意,视频剪辑通常带有音轨和遮...

  • VideoJS-轨道-音频轨道

    音频轨道Audio Tracks 音轨允许为视频选择替代音频,可为用户提供备用音轨选择,以便播放主轨之外的音轨。v...

  • iOS音轨合成(音频与音频,音频与视频)

    今天和大家一起分享关于音轨合成的坑(套路!全TM是套路!走一步套一路) 理论部分: 我们需要用到AVURLAsse...

  • GoldWave

    合并音轨 对被添加的音轨选择"复制" 对添加的音乐选择"混音" 设置其他选项

  • ffmpeg 合成youtube 1080p 视频与音轨参数

    现在从youtube上下载到的Adaptive1080p是音视频分离的,可以用FFmpeg对其合并,但之前大多数下...

  • MineAudio远程后台

    公告【MineAudio老版本的音轨列表音轨多的话会导致替换源文件错乱,新版本已修复】公告

网友评论

      本文标题:36.音轨合成

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