zoukankan      html  css  js  c++  java
  • FFmpeg在VS2017下的编译

    今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境。

    简单记录下过程,以防将来重装系统等情况,备忘。

    https://github.com/ShiftMediaProject/FFmpeg

    git clone 此项目,运行SMPproject_get_dependencies.bat 下载。

    不过我之前并不知道这个自动下载依赖,我直接clone了这个人的所有项目......

    查看SMP eadme.txt,可知,除了相关库外,还需要单独下载一些他没有带的内容。

    你需要建一个目录,包含这些单独的头文件。

    比如叫__FFMPEG_Need,建立一个include目录,再在其下建立4个目录

    AMF

    ffnvcodec

    gl

    KHR

    在gl目录中放入以下2个文件

    https://www.khronos.org/registry/OpenGL/api/GL/glext.h

    https://www.khronos.org/registry/OpenGL/api/GL/wglext.h

    KHR放入

    https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h

    然后clone这个项目

    https://github.com/FFmpeg/nv-codec-headers

    把这个项目include下的内容,直接放到我们当前include目录即可,也就是复制那个ffnvcodec目录

    最后clone AMF

    https://github.com/GPUOpen-LibrariesAndSDKs/AMF

    amf/public/include

    内容放到你的AMF目录下,也就是把

    components

    core

    复制到AMF目录下

    至此,include目录准备完毕,等会编译工程,把这个目录加入所有工程include路径即可,你可以选择加入VS全局include目录里。

    ========================================

    接下来下载YASM和NASM

    http://yasm.tortall.net/Download.html

     YASM只需下载exe即可,32还是64位随意,我只需要32位,

    http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win32.exe

    下好后改名yasm.exe

    建个目录,比如

    E:Yasm

    把yasm.exe放入

    新建环境变量YASMPATH,写入路径地址

    注意路径最后要有反斜杠结尾

    然后下载NASM

    https://www.nasm.us/pub/nasm/releasebuilds/2.14/

    要下载安装器,不知道为什么,我下载zip好像失败了,所以只能用exe安装版本。

    https://www.nasm.us/pub/nasm/releasebuilds/2.14/win32/nasm-2.14-installer-x86.exe

    把nasm安装一下,比如

    E: asm-2.14

    之后同上,新建环境变量NASMPATH,加入路径

    因为我是单独clone的所有工程,所以

    https://github.com/ShiftMediaProject/VSYASM

    https://github.com/ShiftMediaProject/VSNASM

    在这2个工程里,把每个工程的

    .props
    .targets
    .xml

    类型配置文件,1个工程有3个文件,总共6个文件,复制到类似下面的目录中,也就是你VS2017的配置目录,VS默认只有masm的配置

    D:Program Files (x86)Microsoft Visual Studio2017EnterpriseCommon7IDEVCVCTargetsBuildCustomizations

    然后打开SMPffmpeg_deps.sln工程,如果提示更新一些VS组件就都选是更新。

    如果工程全都可以打开,不缺少工程的话,那么配置就OK了。如果有加载不了的项目,分2种情况

    1.如果是少工程就补全工程。

    其他工程都与ffmpeg同级。

    ffmpeg

    libass

    这样同级目录

    2.如果工程文件目录都正常存在,但是还是加载不了,可能就是YASM和NASM配置有问题,但是现在应该都配置好了,我是先有问题,才后装的NASM。

    最后,你应该得到一个可以打开

    FFmpegSMPffmpeg_deps.sln

    之后,所有工程都可以加载上的,没有Load Fail的Solution

     

    试着编译,如果显示Windows SDK不正常,修改一下所有工程使用的SDK即可,默认似乎是Win8 SDK,我重装VS2017似乎只有Win10 SDK,没有Win8,所以改成Win10 SDK才能编译。

    继续,如果编译libav之类的库,一定会提示缺少头文件,因为最开始单独下载的那些include头文件没有放进VS全局目录,加入即可。

    比如

    E:PProjectsGitDownloads\__FFMPEG_Needinclude

    然后再次编译,直接编译debug即可,因为主要是学习原理,而非测试运行效率。

    如果全都编译通过没有错误,就可以再打开

    FFmpegSMPffmpeg.sln

    把ffplay之类的也编译了,对我来说ffplay才是重点,因为这是播放器应用实例,我个人能在网上找到播放视频最实用的例子了。

    展开ffplay工程,ffplay.c文件,如果直接编译这个ffplay,生成的ffplay.exe播放视频会提示音频初始化失败而播放不出声音,似乎是因为dsound初始化失败了。

    根据之前2次编译ffplay的经验,在文件头加入window头

    #include <Windows.h>

    搜索SDL_OpenAudioDevice

    在这行前加入

    CoInitialize(NULL);

    再编译即可修复音频问题。

    我的FFMPEG工程目录在

    E:PProjectsGitDownloadsFFmpeg

    那么生成的文件在

    E:PProjectsmsvcinx86ffplay.exe

    这个msvc目录似乎是自动生成的

    还不算完,现在要测试一个带字幕的视频文件,并且用ffplay播放字幕。

    一般的命令,比如ffplay mv.mkv是不会播放视频的字幕的。

    想播放字幕,正确的用法是

    ffplay -vf subtitles=mv.mkv mv.mkv

    外挂字幕同理

    ffplay -vf subtitles=mv.ass mv.mkv

    这样才行

    至此结束,可以开始断点跟踪代码走向了,最叼的是全VS工程,完全可控的代码,让你有心情查看每一个库的实现,而不是像屎一样的那种一堆源码,自动编译完就能用的那种垃圾。

  • 相关阅读:
    中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
    各种求逆元
    A*(A_star)搜索总结
    线段树总结
    C++的STL
    Unable to make the session state request to the session state server处理方法
    判断UserAgent是否来自微信
    VS2010 EntityFramework Database First
    VS2010类似Eclipse文件查找功能-定位到
    Newtonsoft.Json随手记
  • 原文地址:https://www.cnblogs.com/cfas/p/11974426.html
Copyright © 2011-2022 走看看