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)")
                }
            }
        }
    }
}

最终输出

相关推荐
雨夜和阳晨4 小时前
FFmpeg录制屏幕及声音
ffmpeg
吴声子夜歌4 小时前
FFmpeg——基础知识及FFmpeg框架
ffmpeg
与火星的孩子对话14 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
aqi0021 小时前
FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
android·ffmpeg·音视频·流媒体
恋猫de小郭2 天前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
不太会编程的IT男2 天前
在 Jetson Orin 开发套件上使用 Hardware Encoder / Decoder 构建 FFmpeg
ffmpeg·视频编解码·h.264
m0_687399842 天前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
点金石游戏出海2 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
aqi002 天前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
旷世奇才李先生2 天前
Swift 安装使用教程
开发语言·ios·swift