ffmpeg+xvid+x264交叉编译全过程

简介:
ffmpeg+xvid+x264交叉编译全过程
1.xvid编译:
下载xvid加压并进入build->generic
输入./configure --host=arm-linux  --prefix=/usr/local/arm/3.4.1/arm-linux/ (很重要,否则在编译 ffmpeg的时候找不到xvidx264
make
成功后进入example文件夹
输入
arm-linux-gcc -o xvid_encraw xvid_encraw.c  -lc -lm -I../src/ -L../build/generic/=build -lxvidcore
即可生成xvid_encraw
2.x264
     最新的版本(我最开始用的是20090715这个)已经有cross-compile的支持了,移植应该还是很顺利的。但是这个版本的win下编译不通过,问题在网上找了一下,没有解决。后来退而求其次,选择了一个20060805的版本,这个版本在网上找到了winvc6可以编译通过的版本,同时也可以在x264的官方ftp上找到linux下可以编译的版本。最后决定使用这个版本。这样可以方便一些在win下的交互调试。 
  
注意,这里要提醒一下,几年之内,x264的变化还是很大的。总之,在需要两个平台交叉调试的时候,看来一个相同的版本是非常有必要的。否则,可能会发生这种情况:程序在win下好用,在linux下就不好用了,然后你一边用vs,一边用gdb,终于找到了不同的地方,发现x264的一个标准API对同一个参数的赋值是完全不一样的……(比如我就发现我使用的两个版本的x264_param_init()函数对param.i_bframe赋值是不同的,导致我的一个程序在win下是好的,linux下就是坏的) 
  
新版本的移植我不说了,大概说一下旧版本的移植。 
  
旧的是没有--disable-asm--cross-compile这两个configure的支持的(前者是对x86的汇编优化,交叉编译的时候当然不要的,后者是交叉编译环境设置)。其实和我之前的移植过程差不多,这里写个步骤: 
  
0.环境 
  

OS:ubuntu 9.04 
Version:x264-snapshot-20060805-2245.tar.bz2 
  
1.配置 
  

./configure --prefix= /usr/local/arm/3.4.1/arm-linux/    --enable-shared --enable-debug 
  
我这里打开了动态链接和debug。前者可以生成libx264.so,后者可以在你调程序用gdb的时候step into库函数里。 
2.修改配置参数 
  
修改config.mak: 
prefix= /usr/local/arm/3.4.1/arm-linux/  
exec_prefix=${prefix} 
bindir=${exec_prefix}/bin 
libdir=${exec_prefix}/lib 
includedir=${prefix}/include 
这里改为ARM
ARCH=ARM
SYS=LINUX 
这里改为arm-linux-gcc
CC=arm-linux-gcc 
这里去掉-DHAVE_MMXEXT -DHAVE_SSE2 -DARCH_X86
CFLAGS=-Wall -I. -O4 -ffast-math -D__X264__ -DHAVE_MALLOC_H -DSYS_LINUX -DHAVE_PTHREAD -s -fomit-frame-pointer 
LDFLAGS= -lm -lpthread -s 
AS=nasm 
ASFLAGS=-O2 -f elf 
VFW=no 
GTK=no 
EXE= 
VIS=no 
HAVE_GETOPT_LONG=1 
DEVNULL=/dev/null 
CONFIGURE_ARGS= '--enable-shared' '--prefix= /usr/local/arm/3.4.1/arm-linux/
SONAME=libx264.so.49 
default: $(SONAME) 
  
修改Makefile,将66~68行的arranlib改为arm下的: 
  
libx264.a: .depend $(OBJS) $(OBJASM) 
                 arm-linux-ar  rc libx264.a $(OBJS) $(OBJASM) 
                 arm-linux-ranlib  libx264.a 
  
3.编译安装 
  
make 
make install   
3..交叉编译ffmpeg
./configure --prefix=/usr/local/arm/3.4.1/arm-linux  --cc=arm-linux-gcc --cpu=arm --enable-shared   --enable-x264 --enable-xvid  --enable-gpl  --enable-pthreads
(注意红色字体非libx264libxvid)
问题1snow.c: In function `predict_slice':
snow.c:2892: warning: passing arg 5 of `add_yblock' discards qualifiers from pointer target type
snow.c: In function `common_init':
snow.c:3244: warning: assignment from incompatible pointer type
snow.c:3244: warning: assignment from incompatible pointer type
snow.c:3245: warning: assignment from incompatible pointer type
snow.c:3245: warning: assignment from incompatible pointer type
snow.c:3246: warning: assignment from incompatible pointer type
snow.c:3246: warning: assignment from incompatible pointer type
snow.c:3247: warning: assignment from incompatible pointer type
snow.c:3247: warning: assignment from incompatible pointer type
make[1]: *** [snow.o] 中断
make: *** [lib] _
答:这是我手动中断编译的,否则死机,这是一个小bug,改正方法,单独编译:
[root@localhost libavcodec]# arm-linux-gcc -O3 -g -Wall -Wno-switch  -DHAVE_AV_CONFIG_H -I.. -I'/home/ffmpeg/ffmpeg-0.4.9-p20051120'/libavutil -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE   -c -o snow.o snow.c这是原来的编译选项, -O3改成-O即可;
问题2x264.c: In function `X264_init':
         x264.c:140: error: structure has no member named `b_cbr'
答: 注释掉140行即可;
问题3
strip:  Unable to recognise the format of the input file
答:打开将config.mk
如下:
 STRIP=strip改为arm-linux-strip即可
解释如下:
Sometimes U got error while doing 'make install' :
strip: Unable to recognise the format of the input file

This is because the flag "INSTALLSTRIP = -s" in file config.mak
will pass to 'install' application while you do "make install" ..........
disable the flag "INSTALLSTRIP = " and make install.;0)

Or edit flag "INSTALL = $your_arm_install_application"
PS;===============================================
一般发生在交叉编译的时候。
因为安装时的install程序检测到标志INSTALLSTRIP = -s ----即需要执行 strip 来剔除一些无用的符号。而此时 strip 又只是宿主机的,所以不能 strip 目标机的文件。
问题4
需要改strip
config.mak  INSTALLSTRIP= -s-s去掉即可


本文转自 曾永刚 51CTO博客,原文链接:http://blog.51cto.com/zyg0227/313085

相关文章
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
705 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
513 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
Ubuntu 编译器
Ubuntu18.4下交叉编译X264和FFMPEG到ARM平台(aarch64-linux-gcc)
Ubuntu18.4下交叉编译X264和FFMPEG到ARM平台(aarch64-linux-gcc)
1928 0
|
Ubuntu 编译器 芯片
FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
304 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
人机交互 C++
QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
362 0
|
编解码 监控 算法
嵌入式linux下的FFmpeg交叉编译(最全面)
嵌入式linux下的FFmpeg交叉编译(最全面)
|
编解码 Ubuntu IDE
基于Ubuntu交叉编译X264, FFmpeg Windows SDK详细教程
基于Ubuntu交叉编译X264, FFmpeg Windows SDK详细教程
355 0
|
编解码 Linux 编译器
FFmpeg引入x264扩展
FFmpeg引入x264扩展
310 0
|
Windows
编译WINDOWS版FFmpeg:编译x264
编译WINDOWS版FFmpeg:编译x264
186 0