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

标签 swift ffmpeg

我一直在浏览网页,甚至是这个网站......但找不到在 swift 制作的 iOS 应用程序中实现 ffmpeg 功能的好选择。
查看的选项以及它们不是解决方案的原因:
SwiftFFmpeg - 我不确定它是否可以在 iOS 上运行,而且我没有看到运行我想要的 Ffmpeg 命令的选项。
MobileFFmpeg - 不再维护,同一创始人的一个新项目创建了一个名为 ffmpeg-kit 的“更好的替代方案”。
ffmpeg-kit - 看起来很棒,但他们的 API 只允许使用 Objective-C 语言进行交互。
任何人都可以给我任何解决方案?

最佳答案

第一的...
确保您了解可用的“包”。您可以自己构建它,但老实说,除非您有非常具体的原因,否则我只会使用预构建包。参见 ffmpeg-kit README.MD 的“8. 包”看看有什么优惠
第二
转至Releases并找到您感兴趣的版本(我使用了 FFmpegKit Native v4.5.1 ),向下滚动并展开您感兴趣的版本的“ Assets ”列表。
对于这个实验,我使用了 ffmpeg-kit-full-4.5.1-macos-xcframework.zip .如果您在 iOS 中执行此操作,则工作流程基本相同,您只需要考虑到您的文件访问是沙盒的(是的,我已经这样做了,是的,视频转码需要很长时间,与桌面相比)
第三
创建一个新的 Xcode 项目。同样,对于这个实验,我使用“Storyboards”作为 UI 创建了一个“MacOS 应用程序”(您可以尝试使用 SwiftUI,但这是本示例现在不需要的另一层复杂性)

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

  • enter image description here
    向前
    对于这个实验,我打开了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. 通过提供 session 特定的执行/日志/ session 回调来执行异步 FFmpeg 命令。” ffmpeg-kit/apple 中的示例文件
    !!重要的 !! - 不要忘记添加 import ffmpegkit到文件的开头!
    此时,它现在应该可以编译了(你会收到一些关于 logsstats 未使用的警告,你可以忽略它们)。
    想了想之后...
    您现在应该意识到我提供的代码实际上不会运行,原因有两个。
  • 我实际上也没有调用 func从任何地方(我将它放在 viewDidLoad 类的 func ViewController 中进行测试)
  • 输入文件,用于 execute命令,不存在。您需要提供对实际文件的实际引用,最好使用绝对路径。然而,这可能需要您更改目标“签名和功能”下的“应用程序沙盒”设置
  • Xcodes 自动代码建议还不错,我主要使用它来填写上面的内容,并以 Obj-c 代码作为起点。

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

    关于swift - 用于 Swift 编码的 iOS 应用程序的 Ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72672889/

    相关文章:

    ios - 如何根据其内在内容调整 View 大小?

    FFmpeg:如何编码最后一个音频帧?

    video - 如何通过ffmpeg对没有声音的red5视频进行编码

    c++ - 从 Windows ffmpeg 0.52 迁移到 linux ffmpeg 0.61 代码错误。如何解决?

    ios - 我不必解包 Swift 可选的情况?

    ios - 使用 UserDefaults 保存来自 plist 的字典数组

    ios - UniversalLink 不适用于 iOS 14 设备,但在模拟器上运行良好

    Android ffmpeg 版本 :invalid address or address of corrupt block passed to dlfree

    c - 从函数返回结构会导致内存损坏

    ios - 如何注册通知类别?