![许可证](https://yellow-cdn.veclightyear.com/0a4dffa0/c03b4ac2-aaee-4254-8b6f-d2675ac832cf.svg?style=flat-square
这个库提供了一种简单的方法来将图像和音频合并成视频或将多个视频合并成一个。
功能
- 从单个图像和音频文件创建视频
- 从多个图像/音频对创建视频
- 从单个音频和多个图像创建视频
- 从单个图像创建视频(无音频)
- 从多个图像创建视频(无音频)
- 将多个视频合并成一个
- 反转视频片段
- 在时间范围内分割视频
- 将单个视频与单个音频合并
支持的视频格式
- mov(仅在合并视频时)
- m4v
- mp4(仅在合并视频时)
要求
- iOS 12.0 或更高版本
- Xcode 10 或更高版本
- Swift 4 或更高版本
交流
- 如果你需要帮助或想问一般问题,你可以在@guardians_devil或@devlabsbg找到我。或在Twitter上使用标签#swift-video-generator
- 如果你发现了bug,请提出issue
- 如果你有功能请求,请提出issue
- 如果你想贡献,请提交pull request
贡献者
安装
CocoaPods
CocoaPods是Xcode的依赖管理器。你可以通过在终端运行以下命令来安装它:
$ gem install cocoapods
要在使用CocoaPods的Xcode项目中使用Swift Video Generator,请在Podfile
中添加它:
platform :ios, '10.0'
use_frameworks!
target '<你的目标名称>' do
pod 'SwiftVideoGenerator'
end
Swift包管理器
要将库作为包依赖添加到你的Xcode项目中,选择File > Swift Packages > Add Package Dependency并输入其仓库URL git@github.com:dev-labs-bg/swift-video-generator.git
手动安装
如果你不想使用依赖管理器,你可以手动集成SwiftVideoGenerator。
下载以下文件:
你需要VideoGenerator.swift文件和Error和Extensions文件夹中的文件。
将文件添加到项目:
- 在Xcode中打开你的项目
- 将你下载的文件添加到项目导航器中。你可以创建自己的文件夹或保持文件原样。
- 完成了。现在你可以开始进行一些视频魔法了。
使用
如果你使用Cocoapods安装SwiftVideoGenerator,你需要导入模块:
import SwiftVideoGenerator
对于**.single和.multiple**类型的视频生成,输出视频文件格式都是m4v。
从单个音频和图像文件创建视频
if let audioURL4 = Bundle.main.url(forResource: Audio4 , withExtension: Mp3Extension) {
LoadingView.lockView()
VideoGenerator.fileName = SingleMovieFileName
VideoGenerator.shouldOptimiseImageForVideo = true
VideoGenerator.current.generate(withImages: [#imageLiteral(resourceName: "image4")], andAudios: [audioURL4], andType: .single, { (progress) in
print(progress)
}, success: { (url) in
LoadingView.unlockView()
print(url)
self.createAlertView(message: self.FinishedSingleTypeVideoGeneration)
}, failure: { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
})
} else {
self.createAlertView(message: MissingResourceFiles)
}
使用生成器类型**.single**,你可以从单个音频和图像对创建视频。
如果你将**audio**数组留空并实现**videoDurationInSeconds**,生成的视频将只包含图像而没有音频。
[示例视频 - 单类型生成](https://drive.google.com/open?id=1vr19Zm2NjpeFbvGQLqJB7ew2lq4ExrOP)
**scaleWidth**属性将图像缩放到所需的大小。仅在**.single**类型的视频中使用。
**fileName**属性设置输出文件的名称。
**videoBackgroundColor**属性在缩放图像时使用。当图像被缩放到比视频帧小的尺寸时,会在图像周围留下空白空间。你可以使用**videoBackgroundColor**属性设置该空间的背景颜色。如果你不指定**scaleWidth**,图像将被缩放(保持宽高比)以填充整个视频帧。
**maxVideoLengthInSeconds**属性用于设置视频的最大长度。如果电影长度超过这个值,它会在指定的时间被截断。(注意,这不会缩放音频以使其适应时间。)
**shouldOptimiseImageForVideo**属性用于优化输入生成器的图像,根据其方向调整到最适合视频的比例。
为没有音频的生成视频设置**videoDurationInSeconds**。
#### 从多个图像/音频对创建视频
如果let audioURL1 = Bundle.main.url(forResource: Audio1, withExtension: Mp3Extension), let audioURL2 = Bundle.main.url(forResource: Audio2, withExtension: Mp3Extension), let audioURL3 = Bundle.main.url(forResource: Audio3, withExtension: Mp3Extension) {
LoadingView.lockView()
VideoGenerator.fileName = MultipleMovieFileName
VideoGenerator.videoBackgroundColor = .red
VideoGenerator.videoImageWidthForMultipleVideoGeneration = 2000
VideoGenerator.current.generate(withImages: [#imageLiteral(resourceName: "image1"), #imageLiteral(resourceName: "image2"), #imageLiteral(resourceName: "image3")], andAudios: [audioURL1, audioURL2, audioURL3], andType: .multiple, { (progress) in
print(progress)
}, success: { (url) in
LoadingView.unlockView()
print(url)
self.createAlertView(message: self.FnishedMultipleVideoGeneration)
}, failure: { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
})
} else {
self.createAlertView(message: MissingAudioFiles)
}
使用类型**.multiple**,你可以创建一个结合多个图像/音频对的视频。完成的视频将队列多个视频,这些视频是通过从数组中取一个图像和音频数组中相应索引的元素创建的,然后将其附加到最终视频中。
如果你将**audio**数组留空并实现**videoDurationInSeconds**,生成的视频将只包含图像而没有音频。
然后,下一对音频和图像将被制作成视频并附加在第一个之后。这将继续进行,直到所有图像/音频对都被附加。如果图像/音频对的数量不相同,多余的音频/图像将不被使用。
**fileName**和**videoBackgroundColor**属性的使用方式与**.single**类型相同。
**videoImageWidthForMultipleVideoGeneration**属性用于设置自定义宽度,图像将在与音频文件合并并生成为视频之前被缩放到这个宽度。默认值为800。
[示例视频 - 多类型生成视频](https://drive.google.com/open?id=1bCoGe2LF6n5Jn9jSgNvj_UbZHv4g9GvG)
#### 从多个图像和单个音频创建视频
如果let audioURL1 = Bundle.main.url(forResource: Audio1, withExtension: Mp3Extension) {
LoadingView.lockView()
VideoGenerator.fileName = MultipleSingleMovieFileName
VideoGenerator.shouldOptimiseImageForVideo = true
VideoGenerator.current.generate(withImages: [#imageLiteral(resourceName: "image1"), #imageLiteral(resourceName: "image2"), #imageLiteral(resourceName: "image3"), #imageLiteral(resourceName: "image4")], andAudios: [audioURL1], andType: .singleAudioMultipleImage, { (progress) in
print(progress)
}, success: { (url) in
LoadingView.unlockView()
print(url)
self.createAlertView(message: self.FnishedMultipleVideoGeneration)
}, failure: { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
})
} else {
self.createAlertView(message: MissingAudioFiles)
}
使用类型**.singleAudioMultipleImage**,你可以创建一个结合多个图像和单个音频的视频。完成的视频将在单个音频的时间线上均匀分布多个图像。
[示例视频 - 多图像/单音频生成的视频](https://drive.google.com/open?id=1THpNWw9gZsEUYqrre8JkmOcFZ4IKsHGd)
#### 合并多个视频为一个
```Swift
if let videoURL1 = Bundle.main.url(forResource: Video1, withExtension: MOVExtension), let videoURL2 = Bundle.main.url(forResource: PortraitVideo, withExtension: Mp4Extension) {
LoadingView.lockView()
VideoGenerator.presetName = AVAssetExportPresetPassthrough
VideoGenerator.fileName = MergedMovieFileName
VideoGenerator.mergeMovies(videoURLs: [videoURL1, videoURL2], success: { (videoURL) in
LoadingView.unlockView()
self.createAlertView(message: self.FinishedMergingVideos)
print(videoURL)
}) { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
}
} else {
self.createAlertView(message: MissingVideoFiles)
}
您可以提供本地资源文件的URL,也可以提供存储在设备上的文件URL(例如在Documents文件夹中)。
目前,合并后的视频保留了最后提供的视频资源的所有preferredTransformations(如镜像或方向)。未来的功能实现中会有更多相关内容。
反转视频片段
if let videoURL1 = Bundle.main.url(forResource: Video2, withExtension: MovExtension) {
LoadingView.lockView()
VideoGenerator.fileName = ReversedMovieFileName
VideoGenerator.current.reverseVideo(fromVideo: videoURL1, success: { (videoURL) in
LoadingView.unlockView()
self.createAlertView(message: self.FinishReversingVideo)
print(videoURL)
}, failure: { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
})
} else {
self.createAlertView(message: self.MissingVideoFiles)
}
您需要提供文件的URL,可选择为反转后的视频文件指定新名称。完成的反转视频不包含音频。
分割视频片段
if let videoURL1 = Bundle.main.url(forResource: Video1, withExtension: MOVExtension) {
LoadingView.lockView()
VideoGenerator.fileName = SplitMovieFileName
VideoGenerator.current.splitVideo(withURL: videoURL1, atStartTime: 10, andEndTime: 40, success: { (url) in
LoadingView.unlockView()
print(url)
self.createAlertView(message: self.FinishSplittingVideo)
}, failure: { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
})
} else {
self.createAlertView(message: self.MissingVideoFiles)
}
您需要提供文件的URL,可选择为分割后的视频文件指定新名称。atStartTime和andEndTime属性以秒为单位标记时间范围的开始和结束。
将视频片段与自定义音频合并
if let videoURL2 = Bundle.main.url(forResource: Video2, withExtension: MOVExtension), let audioURL2 = Bundle.main.url(forResource: Audio2, withExtension: Mp3Extension) {
LoadingView.lockView()
VideoGenerator.fileName = NewAudioMovieFileName
VideoGenerator.current.mergeVideoWithAudio(videoUrl: videoURL2, audioUrl: audioURL2, success: { (url) in
LoadingView.unlockView()
print(url)
self.createAlertView(message: self.FinishMergingVideoWithAudio)
}) { (error) in
LoadingView.unlockView()
print(error)
self.createAlertView(message: error.localizedDescription)
}
} else {
self.createAlertView(message: self.MissingVideoFiles)
}
您需要提供视频和音频的URL,可选择为生成的视频文件指定新名称。
已在以下应用中使用:
致谢
SwiftVideoGenerator由Dev Labs创建和维护。您可以在@devlabsbg或devlabs.bg找到我们。
许可证
SwiftVideoGenerator基于MIT许可证发布。详情请参阅LICENSE。