最近在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文件放入树莓派中即可执行。