FFMPEG 套件 iOS 异步调用未异步运行

2024-01-11

当我打电话给executeAsync的方法FFmpegKit我期望异步行为,但代码会运行但从不等待FFmpegKit.executeAsync运行,因此,程序输出来自print("FFmpeg process exited with state \(FFmpegKitConfig.sessionState(toString: session.getState()) ?? "Unknown") and rc \(returnCode).\(session.getFailStackTrace() ?? "Unknown")")(在下面的代码中看到)顺便说一句,它是立即输出的...以确保我检查了输出文件路径并且没有文件保存在那里,这意味着 FFMPEG 命令实际上并未执行。

guard let outputPath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else { return }
                    let output = outputPath.appendingPathComponent("file1.mp4")
                    FFmpegKit.executeAsync("-i http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4 -c:v \(output.path)") { 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 logs != nil else { return }
                        // CALLED WHEN SESSION PRINTS LOGS
                    } withStatisticsCallback: { stats in
                        guard stats != nil else { return }
                        // CALLED WHEN SESSION GENERATES STATISTICS
                    }

如果我尝试await为了FFmpegKit.executeAsync顺便说一句,我得到一个No 'async' operations occur within 'await' expression警告,这应该发生,因为该方法不是异步的。

如果您想复制此内容,发布的代码除了可以通过下载的依赖项之外不依赖于任何其他内容GitHub 存储库下载链接 https://github.com/tanersener/ffmpeg-kit/releases/download/v4.5.1/ffmpeg-kit-full-4.5.1-ios-xcframework.zip

如果您想了解有关如何安装依赖项的更多信息,请单击here https://stackoverflow.com/questions/72672889/ffmpeg-for-use-in-ios-application-coded-in-swift

Question为什么我的异步 FFMPEG 方法立即运行并退出,而不执行我传递的 FFMPEG 命令?

我熟悉相对较新的异步和等待功能,因此我以这种方式对待它,我将上面的代码封装在一个异步函数中,我在调用时等待该函数。


我复制了你的代码。如果您删除来自您提到的原始示例的选项“-c:v”,它就可以正常工作。我不知道他们做了什么,但你可能想在那里添加一些其他参数。

如果您想更新 UI,还请记住在完成块中返回到主线程。

这是我的完整代码:

import UIKit
import ffmpegkit

class ViewController: UIViewController {
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.asyncCommand()
    }
    
    func asyncCommand() {
        self.view.backgroundColor = .orange
        guard let outputPath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else { return }
        let output = outputPath.appendingPathComponent("file1.mp4")
        try? FileManager.default.removeItem(at: output)
        FFmpegKit.executeAsync("-i http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4  \(output.path)") { 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")")

            DispatchQueue.main.async {
                if ReturnCode.isSuccess(returnCode) {
                    self.view.backgroundColor = .green
                } else {
                    self.view.backgroundColor = .red
                }
            }
        } withLogCallback: { logs in
            guard logs != nil else { return }
            // CALLED WHEN SESSION PRINTS LOGS
        } withStatisticsCallback: { stats in
            guard stats != nil else { return }
            // CALLED WHEN SESSION GENERATES STATISTICS
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFMPEG 套件 iOS 异步调用未异步运行 的相关文章

随机推荐

  • 无法正确编写签名助手应用程序代码

    我正在尝试对我的帮助应用程序进行代码签名 我已经为其创建了一个单独的配置文件 它是有效且有效的 我可以将其存档并导出以供 Mac App Store 提交 但是 当我运行主应用程序并将帮助程序添加为守护程序时 帮助程序应用程序开始运行 但它
  • GitHub 默认 README 标记

    这是一个与 GitHub 功能相关的非常简单的问题 该功能可以获取 README 文件并将其显示在任何存储库上 我知道它使用这个存储库可以做到这一点 https github com github markup 但想知道是否在没有任何扩展的
  • 垃圾收集器如何识别根

    标记 清除垃圾收集器的第一阶段是标记 查找 堆上的所有活动对象 为此 必须有一个起点或根 所有标记都从那里开始 GC如何识别这样的根 假设一组不同的对象是可访问的 这些对象被称为根 通常 这些对象包括从调用堆栈中任何位置引用的所有对象 即当
  • 通过 VPN 连接的 iPhone 远程调试

    当我的 iPhone 使用本地 WiFi 时 Xcode 会通过网络看到我的 iPhone 我的 Mac Pro 开发计算机正在运行带有 VPN 服务器的 macOS Server 当我从 iPhone 通过 VPN 连接到 Mac Pro
  • Qt:在构造函数内部连接 ​​- 在初始化对象之前会调用槽吗?

    我正在学习 Qt 框架 C 想知道 QT 是否有任何机制来保护插槽在对象完全初始化之前不被调用 考虑 A 类构造函数 A A mTreeView new QTreeView connect mTreeView QTreeView custo
  • 删除html表格中的外边框

    我正在开发 HTML 格式的报告 我那里有一张桌子 在每个 TD 中我都有另一个表 我想将 td 中的每个表分开 所以我启用了主表的边框 但内部表格很少需要显示单元格边框 但我不希望显示该特定内部表格的外边框 Ex table tr td
  • 是否可以使 VSO(Visual Studio Online)存储库公开可见?

    我喜欢 VSO Visual Studio Online 功能及其能力 但我希望其他用户 匿名 能够查看我的某个项目的存储库 我试图在项目设置中使用安全性内容 但无法弄清楚如何设置对我的存储库的公共访问 有可能吗 目前 没有 VSTS 目前
  • 当应用程序处于后台且具有数据负载时,如何处理 Android FCM 消息? [复制]

    这个问题在这里已经有答案了 当应用程序处于后台时 使用 FCM 的 Android 推送通知无法处理 默认消息显示在通知托盘中 任何人都可以帮助我如何在后台应用程序时处理消息 Override public void onMessageRe
  • 在 Swift 中,如何扩展类型别名?

    我有一个类型别名 typealias BeaconId String NSObject 我想通过做类似的事情来扩展它 extension BeaconId 但这会引发编译错误 必须在非专用泛型类型 Dictionary 上声明约束扩展 并使
  • RangeError(索引):无效值:唯一有效值为0:1

    我是颤振的新手 我正在尝试将数据列表添加到视图中 数据列表具有不同长度的不同订单项集合 我正在从 API 获取数据 但由于订单数据的长度不同 我收到如下图所示的错误 我的 json api 如下 status success message
  • 检测 AppWidget 上的 OnTouch。如果可以的话?

    检测 AppWidget 上的 OnTouch 如果可以的话 你好 我正在尝试为 Android 2 1 创建我的第一个 AppWidget 其中客户端可能有机会在我的自定义视图上选择一个项目 我将为其创建一个自定义视图和一个滑块 客户可以
  • 从 Flowable Room ORM 发出每个项目

    我在 Room ORM 中有一个项目列表 我想在 Recycler 视图中显示它 数据正在从网络添加到数据库 问题是我每次都会得到从 Flowable 发出的整个列表 而不是每个项目 我尝试过 distinctUntilChanged 没有
  • 从表生成sql脚本

    替代文本 http www freeimagehosting net uploads 64fac9c8c4 gif http www freeimagehosting net uploads 64fac9c8c4 gif 是否可以为所有表生
  • 如何将 GKE Ingress 与 Nginx Ingress 结合使用?

    GKE 入口 https cloud google com kubernetes engine docs concepts ingress https cloud google com kubernetes engine docs conc
  • 用于查找一组字符串中最长公共起始子字符串的 R 实现

    这个问题只是要求在 R 中实现以下问题 查找一组字符串中最长的公共起始子串 https stackoverflow com questions 1916218 find the longest common starting substri
  • 如何防止 Visual Studio 自动完成功能覆盖下一个单词

    我在 Visual Studio 中遇到一个非常烦人的问题 我的版本是 2010 我安装了 ReSharper 和 VsVim 但我认为这并不重要 当我在某些现有代码开头的某些代码之前添加文本时 自动完成功能喜欢覆盖某些现有代码 以这个示例
  • 当数据类型为数字时,如何对谷歌图X轴进行排序

    我有一个数据表 第一列是 1 到 48 范围内的数字 Step Pct 1 0 2 0 3 0 4 35 5 45 6 55 7 60 我的代码如下所示 Grid Table is my html table containing the
  • 如何删除超过 (n) 天的文件,但保留 (n) 个文件,无论其年龄如何?

    我用 PHP 编写了以下内容 但我想知道是否有一种优雅的方法可以在 Linux shell 脚本中执行此操作 基本上删除超过 n 天的文件 但保留 n 最新的文件 无论其年龄如何 PHP foreach glob backup db as
  • MySQL - SELECT + JOIN + ORDER BY 性能

    我有两个表 我需要从两个表中选择一些连接的数据 SELECT f FROM file data f JOIN subscriptions s ON f uid s elementid WHERE s uid 119762 AND f pri
  • FFMPEG 套件 iOS 异步调用未异步运行

    当我打电话给executeAsync的方法FFmpegKit我期望异步行为 但代码会运行但从不等待FFmpegKit executeAsync运行 因此 程序输出来自print FFmpeg process exited with stat