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



当我调用FFmpegKitexecuteAsync方法时,我期望异步行为,但代码是运行的,但从不等待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
}

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

如果你想复制这一点,发布的代码不依赖于任何其他依赖项,而依赖项可以通过GitHub回购下载链接下载

如果你想了解更多关于如何安装依赖项的信息,请点击此处

问题为什么我的异步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
}
}
}

最新更新