我一直在浏览网页,甚至是这个网站......但找不到在 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
您从最后一步下载的文件。 *.xcframework
从 Finder 到项目的“框架、库和嵌入式内容”部分的文件夹 向前
对于这个实验,我打开了
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
到文件的开头!此时,它现在应该可以编译了(你会收到一些关于
logs
和 stats
未使用的警告,你可以忽略它们)。想了想之后...
您现在应该意识到我提供的代码实际上不会运行,原因有两个。
func
从任何地方(我将它放在 viewDidLoad
类的 func
ViewController
中进行测试)execute
命令,不存在。您需要提供对实际文件的实际引用,最好使用绝对路径。然而,这可能需要您更改目标“签名和功能”下的“应用程序沙盒”设置 另外,请注意,SO 不是“教程”站点,Xcode 是一个复杂的野兽,您可能需要花一些时间探索其他资源来克服遇到的问题
关于swift - 用于 Swift 编码的 iOS 应用程序的 Ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72672889/