我是靠谱客的博主 失眠煎蛋,这篇文章主要介绍Linux下编译x264与树莓派交叉编译X264(附加测试小程序),现在分享给大家,希望可以做个参考。

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

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

一、Ubuntu PC编译x264

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

1、

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

复制代码
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):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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

他的程序:

复制代码
1
2
3
4
5
6
7
8
9
#!/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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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程序了:

复制代码
1
arm-linux-gnueabihf-g++ -o rasmain main.cpp `pkg-config --cflags --libs rasx264`

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

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

最后

以上就是失眠煎蛋最近收集整理的关于Linux下编译x264与树莓派交叉编译X264(附加测试小程序)的全部内容,更多相关Linux下编译x264与树莓派交叉编译X264(附加测试小程序)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部