iOS 集成ffmpeg

前言

本来打算用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

Swift 复制代码
import ffmpegkit
import UIKit

class 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 in
            let 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)")
                }
            }
        }
    }
}

最终输出

相关推荐
茶底世界之下36 分钟前
仙人掌与沙丘的傍晚:用 Awaking 让侧光有了层次
ios·app·产品
茶底世界之下1 天前
蓝调鱼市的一盏暖灯:用 Awaking 把冷海与灯光分开
ios·app·产品
架构师伯子明1 天前
ffmpeg学习4:opencv在音视频领域常用指令
opencv·学习·ffmpeg
Android系统攻城狮2 天前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
茶底世界之下2 天前
窗边白雏菊与旧书:用 Awaking 留住一束暖光
ios·app·产品
茶底世界之下3 天前
阴天海边的蓝船:用 Awaking 把灰蓝调成清亮主角
ios·app·产品
Android系统攻城狮3 天前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
Digitally3 天前
如何将 iPhone 备份到 iCloud?
ios
传奇开心果编程4 天前
【Flutter踩坑排雷】第19课:路由硬编码坑|字符串路由书写错误,页面跳转失败排查
android·flutter·ios·移动开发·跨平台·ui框架·声明式ui
茶底世界之下4 天前
雨后街口的斑马线:用 Awaking 把颜色让给光与步伐
ios·app·产品