我一直在浏览网页,甚至这个网站......但是找不到一个好的选项来在用 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
),向下滚动并展开您感兴趣的版本的“资产”列表。
在这个实验中,我使用了 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 file2.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. 通过提供会话特定的执行/日志/会话回调来执行异步 FFmpeg 命令。” ffmpeg-kit/apple文档中的示例
!!重要!! - 不要忘记将
import ffmpegkit
添加到文件的开头!
此时,应该可以编译了(您将收到一些关于
logs
和 stats
未使用的警告,您可以忽略它们)。
您现在应该意识到,我提供的代码实际上不会运行,原因有两个。
func
(我通过将其放在viewDidLoad
类的func
ViewController
中进行测试)execute
命令中使用的输入文件不存在。 您将需要提供对实际文件的实际引用,最好使用绝对路径。 然而,这可能需要您更改目标“签名和功能”下的“应用程序沙箱”设置另外,请注意,SO 不是一个“教程”网站,Xcode 是一个复杂的野兽,您可能需要花一些时间探索其他资源来克服遇到的问题