首页 > 技术文章 > VS2015编译VLC3.0.6源码

shawn-meng 2019-07-06 02:02 原文

  最近的项目需要用vlc来做二次开发,于是需要编译vlc源码。在windows下开发,当然用VS(宇宙第一IDE,VS2017的安装包近20G)比较方便。用VS编译vlc挺费劲的,编译加上调试约一周时间,这个过程也很考验耐心的。需要感谢一下sunqueen(https://github.com/sunqueen/vlc-2.2.1.32-2013),编译过程中参考了sunqueen的修改。

  闲来无事,博主在家重新编译了一遍,梳理一遍,把之前没有搞明白的地方搞清楚,同时也给同道中人一些思路。

  博主使用的是vs2015@win10教育版64位系统,vs2017实在太大了,安装包将近20G,电脑装不下了,要不然怎么是宇宙第一IDE呢。

  关于VLC在windows下的编译,VLC官网(https://www.videolan.org/)给的编译方式有两种,并没有windows下vs的编译指导,实际上用Visual Studio是编译不过的。VLC使用c语言写的,但是它用了很多C99和C11的特性,比如定义动态数组,泛型_Generic ,对齐处理操作符 alignof,_Noreturn,原子操作等等,VS2015对C99和C11的支持是不全的,所以需要对源码做一些小的改动才行。

  1.编译顺序:compat->跨平台兼容库,libvlccore->vlc核心库,libvlc,plugins->vlc的插件(modules)们,博主只用到live555,avcodec,direct3d,drawable,hevc,就只编译了这几个plugin.

  2.配置文件config.h,由config.h.in改名而来,是整过解决方案的配置,每个工程都会包含它,所以每个工程都要加上预处理器定义HAVE_CONFIG_H。仔细去核对它每一项宏定义,支持的就把#undef改成#define即可。注意使用UNICODE时,config.h中的#undef UNICODE要注释掉,否则它会undef掉工程的预处理器UNICODE

  3.编译compat,基本没什么改动,不需要的*.c文件不要加入工程即可;

  4.编译libvlccore,主要修改如下,一些小修改没有列出来

  4.1 #warning xxx修改成#pragma message("xxx")

  4.2 定义动态数组修改,改成足够大的数组或是使用malloc替换,用malloc时注意释放内存;

  4.3 泛型关键字_Generic的修改,不使用add_overflow(a,b,r),直接调用对应的uadd_overflow()函数

  4.4 update_cryto.c移出工程

  4.5 “stdnoreturn.h”: No such file or directory,不包含这个头文件,在sap.c中把noreturn宏定义成空,即#define noreturn 

  4.6 无法打开包括文件: “fourcc_tables.h”: No such file or directory: 这个文件需要src/misc/fourcc_gen.c来生成,创建一个fourcc_gen的win32控制台工程,配置vs重定向输出,在属性->调试->命令行参数中输入"1>fourcc_tables.h",用调试方式运行fourcc_gen,在工程目录下生成fourcc_tables.h,拷贝到/src/misc下

  4.7 最后链接的时候报了一堆函数找不到:原因是warning MSB8027: Two or more files with the name of xxx ......,vlc在不同文件下有同名*.c文件,vs编译时中间文件输出到同一个文件夹下,导致后生成的*.obj覆盖先生成的*.obj。解决办法,修改具有同名*.c生成的*.obj文件名,改成不一样即可。右键对应C文件->属性->C/C++ ->输出文件->文件对象名。

  4.8 添加链接库Ws2_32.lib和compat.lib

  4.9 error LNK2001: 无法解析的外部符号 _strncasecmp,在config.h中增加 #define strncasecmp strnicmp

  4.10 在config.h中增加#define HAVE_DYNAMIC_PLUGINS 1

  4.11 链接的时候根据具体错误一一排查,缺铁补铁缺钙补钙

  5.编译libvlc,相对libvlccore就容易得多

  6.编译插件们plugins

  6.1 live555: 源码下载地址http://www.live555.com/liveMedia/public/,我使用了次新版本live.2019.06.28.tar.gz。编译基本无阻碍

  6.2 avcodec: 需要使用ffmpeg库(后续再使用ffmpeg源码编译),ffmpeg官网http://ffmpeg.org/,下载地址https://ffmpeg.zeranoe.com/builds/win32/dev/https://ffmpeg.zeranoe.com/builds/win32/shared/,前者是编译需要的头文件和lib文件,后者是运行时的dll文件。

  6.3 direct3d:

  6.4 swscale:

  只需要这四个plugin就可以播放出视频,可以找一个在线源rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov测试一下。

 

  2021-11-12: 需要vs2015工程的,可以给我发邮件,我邮箱地址mxs_xyz@163.com,这里留言我不一定看得到。已经过去好久了,我已不再搞vlc了,后来也开发了playsdk,所以遇到问题的话不要发邮件问我啊,我可能真的不知道怎么解决。

  2022-01-17: 有同学给我发邮件要源码,我经常过好几天才看到,耽误事儿, 放到CSDN了,下载地址:https://download.csdn.net/download/M_xyz/76298162,不需要下载积分。

 

推荐阅读