Linux下编译x264与树莓派交叉编译X264(附加测试小程序)

最近在Linux下做摄像头视频实时传输的项目。摄像头在服务器端(树莓派),摄像头的视频数据是通过v4l2获取的,一帧视频数据大概有1M左右,如果不使用x264将视频数据进行编码就直接通过网络发送给客户端,就会非常影响传输效率。

为了方便测试代码,我既在搭载Ubuntu系统的PC上编译了x264,又使用树莓派交叉编译工具编译了x264,下面我分别说一下二者的编译过程以及遇见的问题。

一、Ubuntu PC编译x264

这个相对简单些,我是参照别人博客编译的,博客链接:https://blog.csdn.net/tuolaji8/article/details/51277767,我直接说一下出现的问题:

1、

如果直接以图中红圈位置的代码执行就会提示:

Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure with --disable-asm. 


解决办法有两个,要么将语句改为:./configure --enable-shared --disable-asm,要么就安装一个nasm(可以参考博客:https://blog.csdn.net/qq_39759656/article/details/80776550)。

2、编译程序时出现问题

我写了一个测试代码(文件名为main.cpp):

#include <iostream>

#include "stdint.h"
#include "x264.h"
#include "x264_config.h"

using namespace std;

int main(int argc,char **argv)
{
    cout<<"x264"<<endl;
    x_param_t Param;
    x264_param_default(&Param);
    return 0;
}

然后编译程序g++ -o main main.cpp,然后提示我有未定义的函数:

然后根据之前编译opencv的经验,有动态库时,需要将动态库链接进来,于是更换命令为:" g++ -o main main.cpp -lx264 "但仍旧出现相同的错误。

我确认自己已经将/usr/local/lib添加进了/etc/ld.so.conf文件中,并且也执行了sudo ldconfig命令。后来我就直接指定x264的路径。即使用指令" g++ -o main main.cpp  -L /usr/local/lib -lx264 "然后就编译成功了,这就说明动态库的位置没有设置成功,于是我重启计算机,然后指令" g++ -o main main.cpp -lx264 "就可以成功编译程序了。

二、树莓派交叉编译x264

因为之前有交叉编译opencv的经验,所以大致思路还是比较清楚的。在网上也搜索到了相关的资料,但是别人只写了代码,却没有相关的解释。

参考博客:https://blog.csdn.net/shell_albert/article/details/45689603

他的程序:

#!/bin/bash
./configure --prefix=/home/shell.albert/libx264arm \
--enable-shared \
--disable-asm \
--host=arm-linux \
--cross-prefix=arm-linux- \
--sysroot=/home/shell.albert/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root \
--enable-pic 

然后我查找资料了解了比较重要的几个指令的含义,下面是我的代码:

#!/bin/bash
./configure --prefix=/usr/local/rasx264 \  #安装位置
--enable-shared \
--disable-asm \
--host=arm-linux \ #程序运行平台
--cross-prefix=/usr/local/cross-compiler-for-raspberry/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- \ #交叉编译工具的位置
--enable-pic

#原博客中的--sysroot我没有用到
#注意代码中的“  \ ” ,这是一句代码,为了方便复制,我重新写一下:
#!/bin/bash
./configure --prefix=/usr/local/rasx264 --enable-shared --disable-asm --host=arm-linux --cross-prefix=/usr/local/cross-compiler-for-raspberry/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- --enable-pic

将这个bash文件放在x264文件夹中,然后执行该脚本即可完成x264的配置,或者进入x264文件夹目录下,直接在终端输入该指令执行也可以。

配置完成之后再依次执行(sudo) make、(sudo) make install即可完成安装。

安装完成之后把/usr/local/rasx264/lib目录(x264的安装位置)中的.so和.so.*文件(动态链接库)复制到交叉编译工具所在路径中的所有lib文件夹下,以便交叉编译x264程序时,交叉编译工具能找到相应的动态链接库。还需要将这些动态链接库复制到树莓派的/lib文件夹下,以便程序在运行的时候也能找到动态链接库(放置到/lib或/usr/lib文件夹下是最便捷的方法,放置到其余的地方还需要额外声明路径)。

然后就是交叉编译x264程序了,测试代码还是用上面的程序。我们可以看到在/usr/local/rasx264/lib目录下还有一个pkgconfig文件夹,里面有一个x264.pc文件,这个就是交叉编译时寻找头文件和动态链接库所用的。我将这个文件重名为rasx264.pc并且将里面的Name的值也相应地改为rasx264。于是便可以使用如下指令交叉编译x264程序了:

arm-linux-gnueabihf-g++ -o rasmain main.cpp `pkg-config --cflags --libs rasx264`

注意一下 ` 不是单引号,而是Esc下面的那个按键。

然后将编译好的rasx264文件放入树莓派中即可执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值