gpt4 book ai didi

cocoa - FFMPeg 与 xcode 集成

转载 作者:行者123 更新时间:2023-12-03 16:59:33 28 4
gpt4 key购买 nike

我已经使用以下命令下载了 ffmpeg 库源代码:git克隆git://git.videolan.org/ffmpeg.git ffmpeg

源代码仅包含“.c”和“.h”文件,现在如何将 ffmpeg 库与我的带有 cocoa 的 xcode 项目集成。

最佳答案

我正在构建一个渲染农场,并且厌倦了在每个渲染节点计算机上分别安装和更新 ffmpeg。如果您想在 OS X 应用程序中使用 ffmpeg,您可以使用预编译选项,并且可以使用 NSTask,我发现的最简单的方法是:

1.如果您还没有免费应用程序 The Unarchiver,请下载该应用程序(可在 App Store 中获取)。

2.转到 ffmpeg 站点 > 下载 >(Apple 图标)> 单击“Static builds for OS X Intel 64-bit”,下载您需要的包。这将是一个类似“ffmpeg-3.0.2-2.7z”的文件。

3.使用 Unarchiver 打开它,将生成一个名为“ffmpeg”的 UNIX 文件。

4.将该文件拖到您的 Xcode 项目中。当您编译时,它将位于您应用程序的主包中。

5.设置您的 NSTask,如下所示(示例在 Swift 中):

guard let launchPath = NSBundle.mainBundle().pathForResource("ffmpeg", ofType: "") else { return }
dispatch_async(dispatch_get_main_queue()) {
let compressTask: NSTask = NSTask()
compressTask.launchPath = launchPath
compressTask.arguments = [
"-y",
"-i", myUncompressedInputFilePath,
"-vcodec", "libx264",
"-b:v", "1500k",
"-c:a", "aac",
"-pix_fmt", "yuv420p", // Necessary to allow playback in OS X Finder and QT Player
myCompressedOutputFilePath
]
compressTask.standardInput = NSFileHandle.fileHandleWithNullDevice()
compressTask.launch()
compressTask.waitUntilExit()

// Do cleanup work here if necessary.
}

就是这样, super 简单而且效果很好。异步调度是可选的,如果您希望它同步运行,请将其删除,但它会阻止程序的执行。您可以在命令行上设置通常可以设置的任何选项,包括要使用的编解码器、比特率、缩放比例等。输出也将显示在 Xcode 的调试 Pane 中(使用“-loglevel”选项控制多少)。 p>

进行 2-pass 编码也非常容易(并且质量上有很大差异):

guard let launchPath = NSBundle.mainBundle().pathForResource("ffmpeg", ofType: "") else { return }
dispatch_async(dispatch_get_main_queue()) {
// Make this a unique name to avoid conflicts if you have simultaneous encodings.
let passLogFilePath = "\(NSTemporaryDirectory())\(NSUUID().UUIDString)_passlog"

let compressPass1: NSTask = NSTask()
compressPass1.launchPath = launchPath
compressPass1.arguments = [
"-y",
"-i", myUncompressedInputFilePath,
"-pass", "1",
"-passlogfile", passLogFilePath,
"-vcodec", "libx264",
"-b:v", "1500k",
"-c:a", "aac",
"-f", "mov",
"/dev/null"
]
compressPass1.standardInput = NSFileHandle.fileHandleWithNullDevice()
compressPass1.launch()
compressPass1.waitUntilExit()

let compressPass2: NSTask = NSTask()
compressPass2.launchPath = launchPath
compressPass2.arguments = [
"-y",
"-i", myUncompressedInputFilePath,
"-pass", "2",
"-passlogfile", passLogFilePath,
"-vcodec", "libx264",
"-b:v", "1500k",
"-c:a", "aac",
"-pix_fmt", "yuv420p", // Necessary to allow playback in OS X Finder and QT Player
myCompressedOutputFilePath
]

compressPass2.standardInput = NSFileHandle.fileHandleWithNullDevice()
compressPass2.launch()
compressPass2.waitUntilExit()

// Clean up ffmpeg pass log files, there should be two of them.
let fm = NSFileManager.defaultManager()
if fm.fileExistsAtPath("\(passLogFilePath)-0.log") {
do {
try fm.removeItemAtPath("\(passLogFilePath)-0.log")
} catch {
print("Failed to remove '-0.log' file.")
}
}
if fm.fileExistsAtPath("\(passLogFilePath)-0.log.mbtree") {
do {
try fm.removeItemAtPath("\(passLogFilePath)-0.log.mbtree")
} catch {
print("Failed to remove '-0.log.mbtree' file.")
}
}
}

关于cocoa - FFMPeg 与 xcode 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416701/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com