c++ - 构建的 ffmpeg.exe 没有按预期工作

标签 c++ windows ffmpeg

在我的 C++ 应用程序中,我想静态使用 ffmpeg 库。

我下载了 ffmpeg-3.4.1 源并使用 MINGW、Yasm 和 VS2015 命令提示符构建了静态链接的 ffmpeg,如下所示,

  1. 下载了msys2-x86_64-20161025.exe
  2. 打开 MINGW 命令提示符后,使用命令“pacman -S make gcc diffutils”安装所需的 gcc 工具
  3. 将 C:\msys64\usr\bin\link.exe 重命名为 C:\msys64\usr\bin\link_orig.exe
  4. 下载 yasm 32 位 exe 并将其路径设置为 PATH 环境变量。 ("%PATH%;D:\ffmpeg")
  5. 运行VS2015,打开MINGW- C:\msys64\msys2_shell.cmd -use-full-path
  6. 打开 MingW,将 pwd 更改为 ffmpeg。运行 ./configure,然后进行 make install。

使用配置:./configure --prefix="build"--toolchain=msvc --arch=x86 --enable-yasm --enable-asm --disable-shared --enable-static

构建成功。我得到了包含 ffmpeg.exe 和 ffprobe.exe 的 bin 文件夹。 ffmpeg.exe 的大小为 18 Mb。还有 7 个库作为 .a 文件。

我想我必须将 .a 文件转换为 .lib 并在应用程序中使用?

我想确认我是否已正确构建所有内容。所以我尝试使用内置的 ffmpeg.exe 将 .webm 文件转换为 mp4。我发现输出文件的大小非常大,质量也很差。 input.webm 文件大小仅为 15 Mb,output.mp4 文件大小约为 188 Mb。

然后我从 https://ffmpeg.zeranoe.com/builds/ 下载了静态链接的 ffmpeg 应用程序.我看到 ffmpeg.exe 的大小约为 35 Mb,并且工作正常。对于同一个 .webm 文件,它创建的 .mp4 文件只有 44 Mb,质量也还可以。我发现它是用很多外部库构建的。

是外部库造成了差异还是我构建的 ffmpeg 应用程序不正确?我的应用程序中是否也需要所有这些库才能获得类似的输出?

来自内置 ffmpeg.exe 的屏幕截图 output.mp4(15 Mb) screenshot output.mp4 from built ffmpeg.exe(15 Mb)

最佳答案

在没有外部库链接的情况下,FFmpeg 已经可以做很多(但不是全部)你希望它做的事情,而且在很多情况下它也不会像使用专门的库那样擅长这些。< br/> 所以,简而言之,是的,对于大多数常见情况(尤其是涉及 MP4 和其他现代格式时),您需要这些外部库。

所以我们要构建 FFmpeg:
构建 FFmpeg 是一场噩梦般的经历。那是在 Linux 上,这是最简单的。

在 Windows 上,在您似乎需要它的地方,它达到了 Lovecraftian 的恐怖级别 - 您已经看过了。

谢天谢地,这个很棒的辅助脚本已经存在:
https://github.com/rdp/ffmpeg-windows-build-helpers
设置运行最新 Ubuntu(或其他发行版,如果您愿意)的虚拟机,并按照“从 Linux 环境交叉编译”的步骤进行操作。
建议将 Windows 管道与 cygwin 或 msys 一起使用,因为与在 linux 上(甚至在 VM 中)本地执行所有操作相比,这实在是太慢了。

该脚本的可配置性也非常高,因此您可以根据需要进行更改。例如,在我的例子中,我从构建脚本中删除了“--disable-shared”选项,因为我需要动态构建。

关于c++ - 构建的 ffmpeg.exe 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48639498/

相关文章:

windows - phpstorm git pull --rebase

c++ - 同时从不同线程写入套接字时会发生什么?

ios - ffmpeg 在 iOS 中将 wma 转换为 mp3

c++ - 以相反顺序打印数组,意外输出 (c++)

c++ - boost::spirit stream_parser 消耗太大?

windows - system() 和 CreateProcess()/CreateProcessW()

windows - 编写自己的 "mixed mode"调试器时如何与 Visual Studio native 调试器交互?

image - FFmpeg - 将两个图像 (.png) 合并到视频 (.mp4) 不起作用

c++ - 禁用 move 构造函数

c++ - 在cuda内核中创建一个 vector