Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成的ffmpeg.exe未按预期工作 在我的C++应用程序中,我想静态使用FFMPEG LIB。_C++_Windows_Ffmpeg - Fatal编程技术网

生成的ffmpeg.exe未按预期工作 在我的C++应用程序中,我想静态使用FFMPEG LIB。

生成的ffmpeg.exe未按预期工作 在我的C++应用程序中,我想静态使用FFMPEG LIB。,c++,windows,ffmpeg,C++,Windows,Ffmpeg,我下载了ffmpeg-3.4.1源代码,并使用MINGW、Yasm和VS2015命令提示符构建了静态链接的ffmpeg,如下所示: 下载了msys2-x86_64-20161025.exe 在打开MINGW命令提示符时,使用命令“pacman-S make gcc diffutils”安装所需的gcc工具 将C:\msys64\usr\bin\link.exe重命名为C:\msys64\usr\bin\link\u orig.exe 下载yasm 32位exe并将其路径设置为path环境变量。(

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

  • 下载了msys2-x86_64-20161025.exe
  • 在打开MINGW命令提示符时,使用命令“pacman-S make gcc diffutils”安装所需的gcc工具
  • 将C:\msys64\usr\bin\link.exe重命名为C:\msys64\usr\bin\link\u orig.exe
  • 下载yasm 32位exe并将其路径设置为path环境变量。(%PATH%;D:\ffmpeg)
  • 运行VS2015,并打开MINGW-C:\msys64\msys2_shell.cmd-使用完整路径
  • 打开MingW时,将pwd更改为ffmpeg。运行./configure,然后进行make安装
  • 使用的配置是:./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个libs作为.a文件

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

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

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

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

    从构建的ffmpeg.exe输出的屏幕截图output.mp4(15 Mb)

    如果没有外部库链接,FFmpeg已经可以完成许多(但不是所有)您希望它完成的事情,而且在许多情况下,它在这些方面的表现也不如专门的LIB好。
    因此,简而言之,是的,对于大多数常见情况,您都需要这些外部lib(特别是当它涉及MP4和其他现代格式时)

    这就引出了构建FFmpeg的问题:
    构建FFmpeg是一种噩梦般的体验。在linux上,这是最简单的

    在你似乎需要它的窗户上,它达到了洛夫克拉夫特式的恐怖程度——你已经看过了

    谢天谢地,这个奇妙的助手脚本存在:

    设置一个运行最新Ubuntu(或其他发行版,如果您愿意)的虚拟机,并遵循“从Linux环境交叉编译”步骤。
    我不建议将Windows管道与cygwin或msys一起使用,因为与在linux上(甚至在虚拟机上)以本机方式进行相比,这是非常缓慢的


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

    如果没有外部库链接,FFmpeg已经可以完成许多(但不是所有)您希望它做的事情,而且在许多情况下,它在这些方面的表现也不如专门的LIB好。
    因此,简而言之,是的,对于大多数常见情况,您都需要这些外部lib(特别是当它涉及MP4和其他现代格式时)

    这就引出了构建FFmpeg的问题:
    构建FFmpeg是一种噩梦般的体验。在linux上,这是最简单的

    在你似乎需要它的窗户上,它达到了洛夫克拉夫特式的恐怖程度——你已经看过了

    谢天谢地,这个奇妙的助手脚本存在:

    设置一个运行最新Ubuntu(或其他发行版,如果您愿意)的虚拟机,并遵循“从Linux环境交叉编译”步骤。
    我不建议将Windows管道与cygwin或msys一起使用,因为与在linux上(甚至在虚拟机上)以本机方式进行相比,这是非常缓慢的


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

    输出文件大小和其他参数可以配置为ffmpeg二进制文件的参数(编码、编解码器、质量…)检查坏mp4文件的流信息和编码过程。您的构建选择了哪个编码器,以及编码参数?输出文件大小和其他参数可以配置为ffmpeg二进制文件的参数(编码、编解码器、质量…)检查坏mp4文件的流信息和编码过程。您的构建选择了哪个编码器,以及编码参数?直接在Windows上使用-不涉及cygwin。不过,仍然使用MinGW&MSYS。这两者都比linux上的“真正的交易”要慢,甚至在VM上也是如此。编辑了答案以反映这一点。根据选项的不同,运行配置需要2-4分钟,使用
    -j8
    构建需要1.5-5分钟。几乎没有“难以置信的慢”。很抱歉,但是“洛夫克拉夫特的恐怖等级”是一种严重的夸张。你可以随心所欲地感到抱歉,但这并不能改变事实。如果没有像这样的构建脚本,情况就是这样。FFmpeg是一款很棒的软件,但在我10多年的经验中,我从未遇到过其他如此复杂的软件,在用户对开发人员的各个方面都不友好。而且速度非常慢,我指的是最大版本的初始构建,不是更改后的后续版本。直接在Windows上使用-不涉及cygwin。但仍然使用MinGW&MSYS。这两者都比linux上的“真正的交易”要慢,甚至在VM上也是如此。编辑答案以反映这一点。运行配置需要2-4分钟,具体取决于选项和1