Ffmpeg 用于用 Swift 编码的 iOS 应用程序

问题描述 投票:0回答:1

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

查看的选项以及它们不是解决方案的原因:

SwiftFFmpeg - 我不确定它是否可以在 iOS 上运行,而且我没有看到运行我想要的 Ffmpeg 命令的选项。

MobileFFmpeg - 不再维护,同一创始人的一个新项目创建了一个名为 ffmpeg-kit 的“更好的替代方案”。

ffmpeg-kit - 看起来很棒,但他们的 API 只允许使用 Objective-C 语言进行交互。

任何人都可以给我解决方案吗?

swift ffmpeg
1个回答
17
投票

首先...

确保您了解哪些“套餐”可用。 您可以自己构建它,但说实话,除非您有非常具体的原因,否则我只会使用预构建包。请参阅 ffmpeg-kit README.MD 的“8. 软件包”以查看提供的内容

第二个

转到 Releases 并找到您感兴趣的版本(我使用

FFmpegKit Native v4.5.1
),向下滚动并展开您感兴趣的版本的“资产”列表。

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

第三

创建一个新的 Xcode 项目。 再次,对于这个实验,我使用“Storyboards”作为 UI 创建了一个“MacOS 应用程序”(您可以尝试使用 SwiftUI,但这是此示例现在不需要的另一层复杂性)

  • 解压您从上一步下载的
    *xcframework.zip
    文件。
  • 在 Xcode 中,选择“project”节点,选择 MacOS 目标(🤞 只有一个目标)。
  • 选择“常规”,将
    *.xcframework
    文件夹从 Finder 拖到项目的“框架、库和嵌入内容”部分

enter image description here

第四

对于这个实验,我打开了

ViewController
类(由 XCode 自动创建)并简单地添加:

func syncCommand() {
    guard let session = FFmpegKit.execute("-i file1.mp4 -c:v file2.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. 通过提供会话特定的执行/日志/会话回调来执行异步 FFmpeg 命令。” ffmpeg-kit/apple文档中的示例

!!重要!! - 不要忘记将

import ffmpegkit
添加到文件的开头!

此时,应该可以编译了(您将收到一些关于

logs
stats
未使用的警告,您可以忽略它们)。

思考之后...

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.