编译使用 libmp4v2库 libmp4v2.lib(atom_tkhd.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday 错误解决办法.

来源:互联网 发布:金特软件 编辑:程序博客网 时间:2024/05/29 19:04

使用mp4v2 写mp43文件出现如下错误:

1>libmp4v2.lib(atom_mvhd.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday
1>libmp4v2.lib(atom_mdhd.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday
1>libmp4v2.lib(mp4file.obj) : error LNK2019: 无法解析的外部符号 _gettimeofday,该符号在函数 "unsigned __int64 __cdecl MP4GetAbsTimestamp(void)" (?MP4GetAbsTimestamp@@YA_KXZ) 中被引用
1>libmp4v2.lib(mp4track.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday
1>libmp4v2.lib(rtphint.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday
1>libmp4v2.lib(atom_tkhd.obj) : error LNK2001: 无法解析的外部符号 _gettimeofday

解决方法:

1.自己提供gettimeofday的定义

2.或者使用其libmissing60.lib(和libmissing60是一回事,60表示vs6下编译通过,实际上我用vc7也编译运行过了)。


1. 自己定义的方法(未验证是否可用).编译可以通过.

static const unsigned __int64 epoch = 116444736000000000L;/*** timezone information is stored outside the kernel so tzp isn't used anymore.*/extern "C" intgettimeofday(struct timeval * tp,void * tzp){FILETIME    file_time;SYSTEMTIME  system_time;ULARGE_INTEGER ularge;GetSystemTime(&system_time);SystemTimeToFileTime(&system_time, &file_time);ularge.LowPart = file_time.dwLowDateTime;ularge.HighPart = file_time.dwHighDateTime;tp->tv_sec = (long) ((ularge.QuadPart - epoch) / 10000000L);tp->tv_usec = (long) (system_time.wMilliseconds * 1000);return 0;}


来源:点击打开链接


原文:

实际上只是一个头文件h264_util.h。h264_util.h封装了x264。我做的工作就是使用模板封装了一下,保证使用任何mp4 container都可以方便地输出mp4文件。使用模板的目的是为了避免任何回调的开销。
h264_util.h依赖于x264
main.cpp依赖于h264_util.h和libmp42(可选)和libmp4av(可选),后两者都是mpeg4ip的一部分。使用的mpeg4ip是为了生成Quicktime7可播放的mp4文件(相信我,这点很难的,我试了很多了。原因不是这些不好,而是QT7太糟糕)。
附带说明一下,所用到的和我写的代码都是可以同时在window下和linux编译运行的(我已经都试过了)。要在windows下编译x264很简单的,参考说明文档就可以。麻烦的是mpeg4ip,其文档声称不再会对windows下的兼容性负责了。要在windows下编译并使用mpeg4ip,有两个办法,或者自己提供gettimeofday的定义,或者使用其libmissing(和libmissing60是一回事,60表示vs6下编译通过,实际上我用vc7也编译运行过了)。
如果同时使用x264和mpeg4ip,又会发现一些兼容性问题。问题的关键在于windows操作下默认没有提供int8_t之类的类型定义,于是mpeg4ip会自己提供一个mpeg4ip_version.h,补上这些定义。所有的跨平台的开源项目似乎都会自说自话地为windows平台(linux下有标准头文件)提供这些定义,如果我同时使用两个这样的开源项目,就可能会产生类型重复定义的编译错误。x264是个特例,它的libx264根本就没有提供这些定义,所以我在h264_util.h补上了这些定义。又由于这些类型定义可能和mpeg4ip_version.h中的定义冲突,所以我在h264_util.h中预先加入了判断避免冲突的宏。要这些宏起作用,mpeg4ip的头文件必须先被#include于我的h264_util.h之前。
要编译x264,必须安装nasm(一种汇编语言编译器),mpeg4ip如果是只编译上文中的两个的话,不需要,否则也需要nasm。
下面就是源代码,包括两个源代码文件,h264_util.h和main.cpp和一个makefile(仅用于linux),GNUmakefile。
h264_util.h封装了x264,main.cpp提供了两个测试例子,一个仅使用h264_util.h演示了如何进行视频编码,另一个测试例子说明了如何生成mp4。test_h264_utilities是在内存中快速生成rgb888的raw image的工具,仅仅是为了我测试方便用,你完全可以不使用它。
使用方法很简单(仅限于于linux,windows下懒得写了),安装libx264,libmp4ip,libmp4v2(./configure;make;make install总会吧?mpeg4ip安装完整的软件包也许会有问题,但是安装是没问题的(先在源代码包的根目录下./configure,然后还是在对应的代码的目录里make;make install),把下述三个文件拷贝到同一个目录里,然后make clean;make;./test_main,就会生成一个叫test.mp4的文件。

0 0
原创粉丝点击