前言
本来打算用flutter去实现一个ffmpeg的项目的,不过仔细分析了一下,我后期需要集成OpenGL ES做视频渲染处理,OpenGL ES的使用目前在flutter上面还不是很成熟,所以最后还是选择用原生来开发
ffmpeg集成到iOS工程
iOS对于ffmpeg的使用,看了网上,很多人说自己去编译ffmpeg源码,弄了半天,没弄好,放弃了,直接使用现成的第三方库 ffmpeg-kit-ios-full-gpl
这是我工程的Podfile文件
platform:ios,'13.0'target 'ffmpeg03' do
pod 'ffmpeg-kit-ios-full-gpl', '6.0'end
遇到的问题
集成上面的裤,pod install之后,工程是运行不起来的,会报下面的错误:
Sandbox: rsync(31518) deny(1) file-write-create
解决方法
方法一:修改Targets -> Build Settings 中 ENABLE_USER_SCRIPT_SANDBOXING
设置 NO
方法二:项目使用cocoaPods进行三方管理 且 使用了 use_frameworks
,把 use_frameworks
注释掉,重新pod install 然后运行
platform:ios,'13.0'target 'ffmpeg03' do
pod 'ffmpeg-kit-ios-full-gpl', '6.0'end
编译通过
测试
工程目录:
项目代码
实现一个视频从mp4转avi
import ffmpegkit
import UIKitclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()}override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {convertVideoFormat()}func convertVideoFormat() {// 获取输入文件路径guard let inputFile = Bundle.main.path(forResource: "12345", ofType: "mp4") else {print("未找到输入文件")return}// 设置输出文件路径let documentsDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]let outputFile = "\(documentsDir)/output.avi"// 构建 FFmpeg 命令let ffmpegCommand = "-i \"\(inputFile)\" -c:v libx264 -c:a aac \"\(outputFile)\""print("执行的命令:ffmpeg \(ffmpegCommand)")// 执行转换FFmpegKit.executeAsync(ffmpegCommand) { session inlet state = session?.getState()let returnCode = session?.getReturnCode()print("Return Code:\(String(describing: returnCode))")if ReturnCode.isSuccess(returnCode) {// 转换成功print("视频转换成功!输出文件位于:\(outputFile)")DispatchQueue.main.async {// 在主线程中更新 UI 或进行下一步操作}} else {// 转换失败if let output = session?.getAllLogsAsString() {print("转换失败,输出日志:\n\(output)")}if let failStackTrace = session?.getFailStackTrace() {print("失败堆栈跟踪:\n\(failStackTrace)")}}}}
}