linuxffmpeg编译选项
下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行
基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语句如下:
依赖库分两方面,参考以下网站列出的依赖库信息,本文选择的版本均参考于此网页: FFmpeg依赖库信息
首先创建 FFmpeg 代码目录,所有的源代码放在这个目录下
FFmpeg 编译之后,即可使用。编译生成的可执行程序在 ~/bin 目录下
注:上面的 ./configure 配置编译后并不能进行调试,需要如下配置.
刚才的工程可以运行,但不能debug。解决此问题,首先认定一点,生成的可执行程序中,ffmpeg 不包含调试信息,调试信息在 ffmpeg_g 中,debug 要选择 ffmpeg_g。
另外,./config选项也是确定包含调试信息的核心,需要在config中添加:
采用以下命令重新config:
一些注意事项; 在使用 ffplay 播放生成 h264 格式的视频时,播放速度会加快,解决方式:不要使用 FFmpeg 转码生成纯 h264 格式的视频,要使用一种容器包含 h264 视频,即生成一种音视频流格式,也就是不要生成纯粹的 h264 码流,而是生成诸如 mkv 等格式的文件。
⑵ ffmpeg 64位编译脚本
NDK版本:android-ndk-r14b
ffmpeg版本:4.2.4 / 4.4
Ubuntu版本:15.5
#!/bin/bash
NDK=/home/linrendi/Desktop/Compile/android-ndk-r14b
PLATFORM=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
PREFIX=/home/linrendi/Desktop/ffmpeg64
CPU=armv8-a
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=android \
--disable-doc \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--arch=arm64 \
--cpu=$CPU \
--disable-asm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \
--nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \
--disable-shared --enable-static \
--enable-small --disable-debug \
--disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-symver \
--enable-neon --enable-pthreads \
--disable-devices --disable-encoders \
--enable-hwaccels --enable-jni --enable-mediacodec \
--enable-encoder=aac \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-encoder=mjpeg \
--enable-encoder=ljpeg --enable-encoder=jpeg2000 --enable-encoder=jpegls \
--enable-muxer=mp4 --enable-muxer=mjpeg \
--enable-runtime-cpudetect \
make clean
make -j4
make install
$TOOLCHAIN/bin/aarch64-linux-android-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a
}
build_one
⑶ 如何把ffmpeg编译进motion
FFmpeg在Windows系统下的编译过程,分四步:
如下:
1. 配置编译环境
2. 下载FFMPEG的代码
3. 编译,获取FFMPEG库(头文件,lib,和DLL)
4. 在VC下配置,测试
1. 配置编译环境
1)安装MSys
下载文件:
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
msysCORE-1.0.11-20080826.tar.gz
解压msysCORE-1.0.11-20080826.tar.gz,比如解压到X:\msys(以下内容都使用该路径描述,X为你安装的盘符)。
解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其他的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。
到“D:\msys\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后(这个不搞错了),按任意键退出即可。
2)安装MinGW
下载文件:
binutils-2.20-1-mingw32-bin.tar.gz
(binutils-2.19.1-mingw32-bin.tar.gz)
gcc-core-3.4.5-20060117-3.tar.gz
gcc-g++-3.4.5-20060117-3.tar.gz
w32api-3.13-mingw32-dev.tar.gz
mingwrt-3.16-mingw32-dev.tar.gz
(mingwrt-3.15.2-mingw32-dev.tar.gz)
mingwrt-3.16-mingw32-dll.tar.gz
(mingwrt-3.15.2-mingw32-dll.tar.gz)
把它们全部解压到X:\msys\mingw。
3)修改“msys.bat”
用文本编辑器打开D:\msys\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。为此,机器上必须已经安装了微软的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在“D:\program files\Microsoft Visual Studio 8\VC\bin”,于是就添加:
call "D:\program files\Microsoft Visual Studio 8\VC\bin"
4)系统整合
复制D:\msys\etc\fstab.sample为X:\msys\etc\fstab,用文本编辑器打开D:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:
D:/mingw /mingw
改为:
D:/msys/mingw /mingw
注意:改的这个目录为mingw你所安装的目录,所以按本文来讲是这个目录。如果你安装不目录不同,就要改成你所安装的目录。
完成以上步骤,MSys+MinGW系统就配置完成了。
2. 下载FFMPEG的代码
下载代码的办法由两个,一个就是用svn 下载下来。我觉得哪怕你知道svn是啥,也不用这个方法,因为太慢了。一个文件一个文件下,最关键SVN对应的地址是国外,都不知道什么才能全部下完。另外一个直接下一个代码的压缩包。
a) SVN下载 地址为svn://svn.ffmpeg.org/ffmpeg/trunk
b) 直接压缩包。
首先进入 http://www.ffmpeg.org/download.html 这个是ffmpeg的官方主页。在 选项FFmpeg SVN下,点击full checkout 或者bare sources。这连个链接第一个可以通过SVN更新代码,所以文件要大点,后面那个是纯代码。或许可以直接点击该文件的这个两个链接的一个直接得到。
(我用的是bare sources的程序)
3. 编译,获取FFMPEG库(头文件,lib,和DLL)
首先通过MSys安装目录下的msys.bat启动MSys,这时会出现一个命令行窗口,它是一个运行着bash的rxvt程序,如下图:
这是一个类似Linux的shell并且在Windows上运行,就像是在使用一个真正的Linux shell。不过使用这个shell时需要注意:
→目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。
→盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。
→文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/Program Files",带有双引号)。
下面切换到存放FFmpeg源代码的目录(假如你的代码解压之后的路径是D:\ffmpeg),方法是输入:"cd /D/ffmpeg"。
接下来要配置FFmpeg,选择编译时包含的库,这里先输入:
./configure --enable-shared --disable-static --enable-memalign-hack
--enable-memalign-hack选项是FFmpeg在Windows上编译成功所必须指定的,待配置完成后,将回到命令提示符,看到下图所示的画面:
如果没有错误的话,就可以"make"具有基本功能的FFmpeg了,在提示符后输入:make。
编译的过程将持续很长时间。如果一切正常,结束后将返回提示符,并有如下的最后编译结束的输出画面:
在提示符后输入:make install。
执行完后会生成几个文件下在MSys目录的local文件夹下。
4. 在VC下配置(这个指如何在VC中调用ffmpeg库),测试
VC环境配置:(假如目录为上图所示)
方法当然就像其他额外库一样,一种是设置VC全局的Include路径为你E:\msys\local\include,设置VC全局lib路径为E:\msys\local\bin,增加操作系统的一个Path E:\msys\local\bin。
另一种就是设置某个工程的lib和Include的路径。增加一个指向上面对应的地址。这个我就不是说的详细,想必玩VC的都知道。
首先 建一个VC的控制台工程,然后把
E:\audio_video\ffmpeg\ffmpeg-0.5\libavcodec\apiexample.c(ffmpeg的存放目录)拷贝到你建的那个工程。然后改名apiexample.cpp。编译。你会发现缺头文件。这个时候你需要将E:\msys\mingw \include(mingw安装目录下的include)的inttypes.h,stdint.h,_mingw.h三个文件拷到D:\msys \include(你ffmpeg库的目录下的include)。编译还是有很多错。
1. 需要在inttypes.h中 #define __restrict__ __restrict
2. 如果是long long 错误就改成__int64,(我没有遇到这个错误)
3. c->time_base.den= (AVRational){1,25}; 改成 c->time_base.num = 1; c->time_base.den = 25;//
4. 最上面的头文件定义如下:
#include <math.h> // 注意这个别忘了,不然会出现math模板的一个错误
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C"
{
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include <libavcodec\avcodec.h>
#include <libavutil\mathematics.h>
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")
}
4.1. 我的理解是在api-example.cpp头文件中加入第4条的内容,即
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavformat/avformat.h" //andrew
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
其中我加了 #include "libavformat/avformat.h",如果不加就会报许多错误,意思是有学多变量没有定义。我测试了加或者不加头#include <math.h>,对编译结果没有影响。
5. api-example.cpp中似乎不支持强制类型转换,如
samples = malloc(frame_size * 2 * c->channels);其实是将(void *)型转换成(short *),于是我在malloc的前面增加了(short *)此问题得以解决。即samples = (short *)malloc(frame_size * 2 * c->channels);
6.按照网上高手的指示我在vs2005的工具->选项->VC++目录中,包含文件一栏,加入我的include文件夹,即D:\msys\local\include
以上,你就可以在VC++中编译ffmpeg了。
⑷ 【FFMPEG】NI Real time linux上安装ffmpeg
由于需要在NI平台上使用ffmpeg库,以实现网络媒体流。安装过程与正常安装有些许区别,记录如下:
1. 硬件平台 NI-IC-373
2. ffmpeg 版本 ffmpeg-3.3.4
参考
/configure会报错:pr command not found
Compile FFmpeg on Ubuntu, Debian, or Mint
参考: [FFmpeg-devel] [PATCH] Fix pkg-config detection when using a cross-prefix
注:如果需要安装libx264支持,请参考
http://blog.csdn.net/li_wen01/article/details/62889494
http://www.cnblogs.com/gjianw217/p/3228455.html
环境变量
引用库目录
参考: 多线程的make
其他参考
1. FFmpeg在Linux下编译使用
2. ffmpeg 在linux下编译
3. FFmpeg在Linux下安装编译过程
4. Linux-安装FFmpeg
其他问题
1. Ffmpeg error in linux [closed]
2. https://linuxserverguide.wordpress.com/2010/10/15/ffmpeg-error-while-loading-shared-libraries-libavdevice-so-52-cannot-open-shared-object-file/
⑸ linux下编译ffmpeg时关于configure的问题.
你准备工作没做好吧!!
先编译安装Yasm。
然后编译安装H.264 (也就是x264)。
再编译安装AAC audio encoder (fdk-aac)。
编译安装libmp3lame (MP3 audio encoder)。
编译安装libopus (Opus audio decoder and encoder)。
编译安装libvpx (VP8/VP9 video encoder and decoder)。
做后编译安装ffmpeg。
其中1-6你可以选择编译安装,也可以使用源直接安装。安装后了再编译安装ffmpeg
你使用 sudo ldconfig -p |grep libx264 看看你的libx264是否正确安装.
你编译安装x264的时候可以使用2中方式都安装。
先
cd ../x264
./configure --enable-shared
make
make install
最后
cd ../x264
make distclean
./configure --enable-static
make
make install
⑹ linux下怎么变异ffmpeg
1、下载ffmpeg。
wget http://down1.chinaunix.net/distfiles/ffmpeg-0.4.9-p20051120.tar.bz2
我是在这个网址上下载ffmpeg-0.4.9-p20051120.tar.bz2,看网上有人用的是svn下载,但是我的机子中没有svn客户端,然后就在网上搜索,下载了这个版本。如果利用svn可以下载ffmpeg最新的版本。
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
2、解压
tar xvfj ffmpeg-0.4.9-p20051120.tar.bz2
得到解压后的目录是ffmpeg-0.4.9-p20051120,名字太长,利用mv命令改为ffmpeg
mv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg
3、配置
./configure --enable-shared --prefix=/usr/local/ffmpeg
其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录。
4、编译并安装
make
make install
5、安装之后在/usr/local/ffmpeg会看到有三个目录
lib 动态链接库位置
include 编程要用到头文件
bin 执行文件所在的目录
6、为了以后方便编程,我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的ffmpeg目录复制到/usr/include下。
这里我这样复制了还是不对,-lavcodec -lavutil -lavformat的时候,提示找不到库
然后我把 /usr/local/ffmpeg/lib 所有文件复制到 /usr/local/lib才可以的
执行bin目录下的ffplay,可以去播放音频或者视频文件。例如播放1.mp3
./ffplay 1.mp3
另外,bin目录下还有两个文件:ffmpeg和ffserver
ffmpeg是一个很好的视频和音频的格式转化工具。网上有很多它的说明文档。如果不想生成ffserver,只要在./configure的时候加--disable-ffserver即可。
7、编程
如果写了一个test.c文件,要包含ffmpeg的头文件,可以这样写:
#include
编译:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第6步的操作)
如果没有第6部的操作,则编译的时候如下:
gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
编译成功之后,执行的时候还是需要动态库的支持,还是要把那三个动态库文件复制到/usr/lib或者/lib中,不然执行的时候会说找不到动态库链接。还有一个方法可以解决这个问题,就是把/usr/local/ffmpeg/lib这个目录加入到/etc/ld.so.config中,然后执行 ldconfig,或者重启电脑,这样执行的时候系统就可以从/usr/local/ffmpeg/lib这个目录下去找这三个动态库文件了。
以上的方式是采用动态库编译ffmpeg的,如果在configure的时候不加上--enable-shared的,则采用静态链接的方式,不会生成那三个动态库。同时生成的ffplay、ffmpeg的执行文件也比较的大,因为他们不需要动态库的支持,就可以执行。但是不利于再次开发,所以我采用动态链接的方式。configure中还有很多的选项,可以通过./configure --help查看,也可以直接查看configure文件。这在配置的时候很重要。
⑺ linux ffmpeg 怎么编64位
1、下载ffmpeg。
下载网址:http://www.ffmpeg.org/download.html
2、解压缩
tar -zxvf ffmpeg-2.0.1.tar.gz
3、配置,生成Makefile
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
如果执行结果不对,可以根据提示信息,并查看帮助,解决问题
./configure --help
4、编译安装
make
make install
5、安装之后在/usr/local/ffmpeg会看到有三个目录
bin 执行文件目录
lib 静态,动态链接库目录
include 编程用到的头文件
为了防止执行程序找不到库文件,
可以将/usr/local/ffmpeg/lib目录设置到LD_LIBRARY_PATH环境变量,
或者查看/usr/local/ffmpeg/lib下所有的链接,并在/usr/lib下建立同样的链接。如下。
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so.55
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so.55
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so.3
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so.55
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so.52
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so.0
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so.2
这时就需要在/etc/ld.so.conf下面加一行/usr/local/ffmpeg/lib,保存过后ldconfig一下,
这时就需要在/etc/ld.so.conf下面加一行/usr/local/MySQL/lib,保存过后ldconfig一下,
6、编译测试程序
gcc -o ffmpegtest ffmpegtest.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
7、执行程序
./ffmpegtest
或直接执行/usr/local/ffmpeg/lib目录下的./ffmpeg进行测试。
⑻ 如何把ffmpeg编译进motion
ffmpeg编译
首先解压ffmpeg-0.5.1.tar.bz2,,执行configure命令如下:
[plain] view plain
./configure --cc=arm-linux-gnueabihf-gcc --host-cc=arm-linux-gnueabihf --prefix=/home/***/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux --enable-cross-compile --arch=arm --disable-yasm
编译:
[plain] view plain
make
出现错误如下:
[plain] view plain
arm-linux-gnueabihf-gcc -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I. -I"/home/***/iWork/lamobo/motion-3.2.12-arm-project/ffmpeg-0.5.1"
-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -std=c99 -fomit-frame-pointer -g -Wdeclaration-after-statement -Wall -Wno-switch -Wdisabled-optimization
-Wpointer-arith -Wrendant-decls -Wno-pointer-sign -Wcast-qual -Wwrite-strings -Wtype-limits -Wundef -O3 -fno-math-errno -fno-signed-zeros -c -o
libavcodec/dsputil.o libavcodec/dsputil.c
/tmp/ccOmDdh7.s: Assembler messages:
/tmp/ccOmDdh7.s:51789: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9'
/tmp/ccOmDdh7.s:51790: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
/tmp/ccOmDdh7.s:51792: Error: thumb conditional instruction should be in IT block -- `movle r9,r7'
/tmp/ccOmDdh7.s:51794: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9'
/tmp/ccOmDdh7.s:51889: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
/tmp/ccOmDdh7.s:51890: Error: thumb conditional instruction should be in IT block -- `movgt r8,ip'
/tmp/ccOmDdh7.s:51892: Error: thumb conditional instruction should be in IT block -- `movle r8,r6'
/tmp/ccOmDdh7.s:51894: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
make: *** [libavcodec/dsputil.o] Error 1
这需要修改~/ffmpeg-0.5.1/config.mak,在OPTFLAGS(line:16)选项中添加:
[plain] view plain
-Wa,-mimplicit-it=thumb
加入这句的意思是在使用Thumb ISA指令编译时自动产生“IT”指令。 继续编译,又报错:
[plain] view plain
strip: Unable to recognise the format of the input file `ffmpeg'
这是strip没有使用交叉编译的版本所致,由于此时我们需要的库文件已经编成,所以这个错误可以忽略不计,修改config.mak中的strip为arm-linux-gnueabihf-strip,继续让编译完成
motion编译
motion中的ffmpeg.c是对ffmpeg api的封装,向其他模块提供功能。如在主程序文件motion.c中
[cpp] view plain
//......
#ifdef HAVE_FFMPEG
/* FFMpeg initialization is only performed if FFMpeg support was found
* and not disabled ring the configure phase.
*/
ffmpeg_init();
#endif /* HAVE_FFMPEG */
//......
这里ffmpeg_init就是ffmpeg.c中封装的方法:
[cpp] view plain
void ffmpeg_init()
{
motion_log(LOG_INFO, 0, "ffmpeg LIBAVCODEC_BUILD %d LIBAVFORMAT_BUILD %d", LIBAVCODEC_BUILD, LIBAVFORMAT_BUILD);
av_register_all();
#if LIBAVCODEC_BUILD > 4680
av_log_set_callback( (void *)ffmpeg_avcodec_log );
#endif
/* Copy the functions to use for the append file protocol from the standard
* file protocol.
*/
mpeg1_file_protocol.url_read = file_protocol.url_read;
mpeg1_file_protocol.url_write = file_protocol.url_write;
mpeg1_file_protocol.url_seek = file_protocol.url_seek;
mpeg1_file_protocol.url_close = file_protocol.url_close;
/* Register the append file protocol. */
#if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)
av_register_protocol(&mpeg1_file_protocol);
#else
register_protocol(&mpeg1_file_protocol);
#endif
}
我们需要在motion的Makefile中加入对ffmpeg模块的编译,并且打开HAVE_FFMPEG等开关。首先执行configure如下:
[plain] view plain
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/stewart/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux
生成Makefile,在OBJ选项中添加ffmpeg.o:
[plain] view plain
OBJ = ffmpeg.o motion.o conf.o draw.o jpegutils.o $(VIDEO_OBJ) netcam.o \
netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o \
alg.o event.o picture.o rotate.o webhttpd.o \
webcam.o
在CFLAGS选项中添加-DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW的定义,加入libjpeg头文件搜索目录
[plain] view plain
libdir = ${prefix}/lib
incdir = ${prefix}/include
[plain] view plain
CFLAGS = -g -O2 -DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -D_REENTRANT
-DMOTION_V4L2 -DMOTION_V4L2_OLD -DTYPE_32BIT="int" -DHAVE_BSWAP -Wall
-DVERSION=\"3.2.12\" -Dsysconfdir=\"$( sysconfdir)\"
在LIBS中加入对ffmpeg库的支持:
[plain] view plain
LIBS = -L${libdir} -static -lavformat -lavcodec -lavutil -ljpeg -lm -lpthread
预备工作完成,make,编译报错:
[plain] view plain
motion.h:44:28: fatal error: linux/videodev.h: No such file or directory
compilation terminated.
由于linux-2.4以上的内核已经取消了videodev.h文件,需要安装libv4l-dev,然后将motion.h,video.h中的
[plain] view plain
#include <linux/videodev.h>
修改为
[cpp] view plain
#include <libv4l1-videodev.h>
继续,又报错:
[plain] view plain
track.c: In function ‘uvc_center’:
track.c:587:29: error: storage size of ‘control_s’ isn’t known
track.c:589:24: error: ‘V4L2_CID_PRIVATE_BASE’ undeclared (first use in this function)
track.c:589:24: note: each undeclared identifier is reported only once for each function it appears in
track.c:592:24: error: ‘VIDIOC_S_CTRL’ undeclared (first use in this function)
track.c:601:31: error: storage size of ‘queryctrl’ isn’t known
track.c:605:24: error: ‘VIDIOC_QUERYCTRL’ undeclared (first use in this function)
track.c:601:31: warning: unused variable ‘queryctrl’ [-Wunused-variable]
track.c:587:29: warning: unused variable ‘control_s’ [-Wunused-variable]
track.c:636:25: error: storage size of ‘control_s’ isn’t known
track.c:636:25: warning: unused variable ‘control_s’ [-Wunused-variable]
track.c: In function ‘uvc_move’:
track.c:724:29: error: storage size of ‘control_s’ isn’t known
track.c:726:24: error: ‘V4L2_CID_PRIVATE_BASE’ undeclared (first use in this function)
track.c:729:24: error: ‘VIDIOC_S_CTRL’ undeclared (first use in this function)
track.c:724:29: warning: unused variable ‘control_s’ [-Wunused-variable]
track.c:779:25: error: storage size of ‘control_s’ isn’t known
track.c:779:25: warning: unused variable ‘control_s’ [-Wunused-variable]
make: *** [track.o] Error 1
在track.c中添加:
[plain] view plain
#include <linux/videodev2.h>
继续,报错(怎么还有啊?):
[plain] view plain
gcc -L/usr/local/lib -o motion motion.o conf.o draw.o jpegutils.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o ffmpeg.o -lm -lpthread -ljpeg -L/usr/local/lib -lavformat -lavcodec -lavutil -lm -lz
/usr/local/lib/libavformat.a(file.o):(.data+0x60): multiple definition of `file_protocol'
ffmpeg.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
原来结构体file_protocol在libavformat.a和ffmpeg.o中重复定义了,分别打开两个定义:
[cpp] view plain
//libavformat/file.c:85
URLProtocol file_protocol = {
"file",
file_open,
file_read,
file_write,
file_seek,
file_close,
};
[cpp] view plain
//ffmpeg.c
URLProtocol file_protocol = {
"file",
file_open,
file_read,
file_write,
file_seek,
file_close,
#if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)
NULL,
NULL,
NULL,
#endif
};
将libavformat/file.c中的file_protocol定义注掉,重新编译一份libavformat.a。然后继续编译motion,又报错:
[plain] view plain
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:917: undefined reference to `BZ2_bzDecompressInit'
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:926: undefined reference to `BZ2_bzDecompress'
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:929: undefined reference to `BZ2_bzDecompressEnd'
这个需要libbz2库,下载地址http://www.bzip.org/downloads.html
编译安装libbz2后将-lbz2加入motion的Makefile的LIBS选项:
[plain] view plain
LIBS = -lpthread -ljpeg -L/usr/lib -lavformat -lavcodec -lavutil -lm -lz -lbz2
⑼ FFmpeg开发怎么入手
您好,很感谢您对我的帮组。另外,我想编译一套Linux上面的(具体是CentOS6.0)。但是有一点,我按网上所的流程编译出来了,实用性不高。您编译过Linux上面的FFmpeg吗?可以给我一点指导吗?谢谢。
