Project Icon

swift-video-generator

iOS图像音频视频合成与处理库

swift-video-generator是一个功能丰富的iOS库,用于图像、音频和视频的处理与合成。主要功能包括将图像和音频合成视频、合并多个视频、反转和分割视频片段等。该库支持iOS 12.0+和Swift 4+,提供简洁API,可通过CocoaPods或Swift Package Manager集成。适用于需要在iOS应用中进行视频处理的开发者。

swift-video-generator-logo

平台 CocoaPods ![许可证](https://yellow-cdn.veclightyear.com/0a4dffa0/c03b4ac2-aaee-4254-8b6f-d2675ac832cf.svg?style=flat-square Twitter链接 网站

这个库提供了一种简单的方法来将图像和音频合并成视频或将多个视频合并成一个。

功能

  • 单个图像和音频文件创建视频
  • 多个图像/音频对创建视频
  • 单个音频和多个图像创建视频
  • 单个图像创建视频(无音频)
  • 多个图像创建视频(无音频)
  • 多个视频合并成一个
  • 反转视频片段
  • 在时间范围内分割视频
  • 单个视频与单个音频合并

支持的视频格式

  • mov(仅在合并视频时)
  • m4v
  • mp4(仅在合并视频时)

要求

  • iOS 12.0 或更高版本
  • Xcode 10 或更高版本
  • Swift 4 或更高版本

交流

  • 如果你需要帮助或想问一般问题,你可以在@guardians_devil@devlabsbg找到我。或在Twitter上使用标签#swift-video-generator
  • 如果你发现了bug,请提出issue
  • 如果你有功能请求,请提出issue
  • 如果你想贡献,请提交pull request

贡献者

  • ibhavin - 版本1.0.8 从单个音频和多个图像创建视频
  • SteliyanH - 版本1.1.0 反转视频片段中的音频

安装

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,可选择为分割后的视频文件指定新名称。atStartTimeandEndTime属性以秒为单位标记时间范围的开始和结束。

示例视频 - 分割后的视频

将视频片段与自定义音频合并

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创建和维护。您可以在@devlabsbgdevlabs.bg找到我们。

许可证

SwiftVideoGenerator基于MIT许可证发布。详情请参阅LICENSE

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号