当我打电话给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(使用前将#替换为@)