在短视频app源码开发中,音视频的混合是对音视频数据进行处理时,非常重要的一个环节,只有做好了音视频混合,才能录制更好的短视频内容。
//音视频合成
func videoAudioMerge() {
// 声音来源
let audioInputUrl = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("五环之歌", ofType: "mp3")!)
// 视频来源
let videoInputUrl = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("Holiday", ofType: "mov")!)
// 最终合成输出路径
let name = currentTimeStamp() + ".mp4"
let temporaryFile = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent(name)
print(temporaryFile)
let outputFileUrl = NSURL(fileURLWithPath: temporaryFile)
// 时间起点
let nextClistartTime = kCMTimeZero
// 创建可变的音视频组合
let comosition = AVMutableComposition()
// 视频采集
let videoAsset = AVURLAsset(URL: videoInputUrl, options: nil)
// 视频时间范围
let videoTimeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
// 视频通道 枚举 kCMPersistentTrackID_Invalid = 0
let videoTrack = comosition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
// 视频采集通道
let videoAssetTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo).first!
// 把采集轨道数据加入到可变轨道之中
do {
try videoTrack.insertTimeRange(videoTimeRange, ofTrack: videoAssetTrack, atTime: nextClistartTime)
}
catch let error {
print(error,"error")
}
// 声音采集
let audioAsset = AVURLAsset(URL: audioInputUrl, options: nil)
// 因为视频短这里就直接用视频长度了,如果自动化需要自己写判断
let audioTimeRange = videoTimeRange
// 音频通道
let audioTrack = comosition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
// 音频采集通道
let audioAssetTrack = audioAsset.tracksWithMediaType(AVMediaTypeAudio).first!
// 加入合成轨道之中
do {
try audioTrack.insertTimeRange(audioTimeRange, ofTrack: audioAssetTrack, atTime: nextClistartTime)
}
catch let error {
print(error,"error")
}
// 创建一个输出
let assetExport = AVAssetExportSession(asset: comosition, presetName: AVAssetExportPresetMediumQuality)
// 输出类型
assetExport!.outputFileType = AVFileTypeQuickTimeMovie
// 输出地址
assetExport!.outputURL = outputFileUrl
// 优化
assetExport!.shouldOptimizeForNetworkUse = true
// 合成完毕
assetExport!.exportAsynchronouslyWithCompletionHandler({() -> Void in
// 回到主线程
dispatch_async(dispatch_get_main_queue(), {() -> Void in
// 调用播放方法
self.playWithUrl(outputFileUrl)
let fileSize = try! NSFileManager.defaultManager().attributesOfItemAtPath(temporaryFile)[NSFileSize] as? NSNumber
let recordSize = (fileSize?.integerValue)!/1024
print(recordSize)
})
})
}
以上就是“短视频app源码开发,音视频混合的实现”的全部内容了。