我一直在浏览网页,甚至这个网站...bu找不到一个好的选项来在swift开发的iOS应用程序中实现ffmpeg功能.

所研究的选项及其不是解决方案的原因:

SwiftFFmpeg-我不确定它是否可以在iOS上运行,而且我看不到运行所需Ffmpeg命令的选项.

MobileFFmpeg-不再维护,同一创始人的一个新项目创建了一个名为ffmpeg工具包的"更好的替代品".

ffmpeg工具包-看起来很神奇,但他们的API只允许使用Objective-C语言进行交互.

有人能给我什么解决方案吗?

推荐答案

First...

确保您了解哪些"软件包"可用.您可以自己构建它,但老实说,除非您有非常具体的原因,否则我只会使用预构建包.请参阅ffmpeg-kit README.MD个套餐中的"8个套餐",了解优惠内容

Second

转到Releases并找到您感兴趣的版本(我使用了FFmpegKit Native v4.5.1),向下滚动并展开您感兴趣的版本的"assets资源 "列表.

在这个实验中,我用了ffmpeg-kit-full-4.5.1-macos-xcframework.zip.如果您在iOS中执行此操作,工作流基本相同,只需考虑到您的文件访问是Sandbox 式的(是的,我已经这样做了,是的,与桌面相比,转码视频需要很长时间)

Third

创建新的Xcode项目.同样,在这个实验中,我创建了一个使用"故事板"作为UI的"MacOS应用程序"(你可以try 使用SwiftUI,但这是这个示例现在不需要的另一层复杂性)

  • 解压缩上一步下载的*xcframework.zip个文件.
  • 在Xcode中, Select "项目" node , Select MacOS目标(???? 只有一个目标).
  • Select "常规",将*.xcframework个文件夹从Finder拖到项目的"框架、库和嵌入内容"部分

enter image description here

Forth

在这个实验中,我打开了ViewController类(由Xcode自动创建)并简单地添加了...

func syncCommand() {
    guard let session = FFmpegKit.execute("-i file1.mp4 -c:v file1.mp4") else {
        print("!! Failed to create session")
        return
    }
    let returnCode = session.getReturnCode()
    if ReturnCode.isSuccess(returnCode) {
        
    } else if ReturnCode.isCancel(returnCode) {
        
    } else {
        print("Command failed with state \(FFmpegKitConfig.sessionState(toString: session.getState()) ?? "Unknown") and rc \(returnCode?.description ?? "Unknown").\(session.getFailStackTrace() ?? "Unknown")")
    }
}

func asyncCommand() {
    FFmpegKit.executeAsync("-i file1.mp4 -c:v file2.mp4") { session in
        guard let session = session else {
            print("!! Invalid session")
            return
        }
        guard let returnCode = session.getReturnCode() else {
            print("!! Invalid return code")
            return
        }
        print("FFmpeg process exited with state \(FFmpegKitConfig.sessionState(toString: session.getState()) ?? "Unknown") and rc \(returnCode).\(session.getFailStackTrace() ?? "Unknown")")
    } withLogCallback: { logs in
        guard let logs = logs else { return }
        // CALLED WHEN SESSION PRINTS LOGS
    } withStatisticsCallback: { stats in
        guard let stats = stats else { return }
        // CALLED WHEN SESSION GENERATES STATISTICS
    }

}

上面的代码基本上是"2.执行同步FFmpeg命令"和"4.通过提供特定于会话的执行/日志(log)/会话回调来执行异步FFmpeg命令."ffmpeg-kit/apple个文档中的示例

!! Important !!-别忘了在文件开头加import ffmpegkit

现在,应该可以编译了(您将得到一些关于未使用logsstats的警告,您可以忽略它们).

After thoughts...

您现在应该意识到,我提供的代码实际上不会运行,原因有二.

  1. 实际上,我没有从任何地方调用任何一个func(我将其放在ViewController类的viewDidLoad func中进行了测试)
  2. execute命令中使用的输入文件不存在.您需要提供对实际文件的实际引用,最好使用绝对路径.然而,这可能需要您更改目标"签名和功能"下的"应用程序Sandbox "设置
  3. Xcode自动代码建议不错,我主要是用它来填写上面的内容,并以Obj-c代码为起点.

此外,请注意,所以不是"教程"网站,Xcode是一个复杂的野兽,您可能需要花一些时间探索其他资源以克服遇到的问题

Swift相关问答推荐

如何在realityKit中反转USDZ动画

格式化单位和度量值.为什么从符号初始化的单位不能产生与静态初始化相同的结果

如果通过计时器循环运行,则检索CPU利用率百分比的SWIFT脚本运行良好.似乎在没有计时器的情况下停留在初始百分比上

NavigationLink和ObservableObject的动画片段

相互取消任务

TimeZone 背后的目的

为 ObservedObject 和 State 对象配置预览

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

动画偏移正在 destruct 按钮 SwiftUI

SwiftUI View Builder 参数无法更改状态

令人满意的 var body:协议扩展中的一些视图

不要从 NumberFormatter 获取货币符号

使用 swift 运行 pod install 时出错

使用 Alamofire 4.0 (Swift 3) 下载文件

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

Alamofire:如何全局处理错误

使用 Swift 以编程方式自定义 UITableViewCell

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)

如何快速显示数组的所有元素?

ISO8601DateFormatter 不解析 ISO 日期字符串