DANGER
📌 注意:本文章以buildroot为系统模板。 其余的Debian和Ubuntu没有实验,所以在转移到开发板这一步骤的时候会有变化。
一、烧录镜像
直接烧录一个buildroot镜像(在泰山派的百度网盘资料里面下载),我这里选择buildroot的HDMI镜像:
烧录成功现象:
二、交叉编译环境配置
在Qt5那一篇文章已经告诉大家如何在Ubuntu18.04.6虚拟机里面配置交叉编译环境了【步骤都是一样的】。
在 Qt5移植 -> 安装交叉编译器(GNU)
【点击跳转🚀】这一章节
在终端输入:
aarch64-linux-gnu-gcc -v
框起来的就是自己电脑的交叉编译器工具路径,一定要记住!!后面要用!
三、交叉编译
1、下载x264源码
方法一【网址下载】:https://www.videolan.org/developers/x264.html
方法二【git拉取】(推荐)
我们这里就使用拉取源码:
git clone https://code.videolan.org/videolan/x264.git
2、交叉编译X264
进入x264目录下:
cd x264/
mkdir x264build
创建一个autoConfig.sh脚本用来编译:
touch autoConfig.sh
编辑autoConfig.sh:
gedit autoConfig.sh
在autoConfig.sh中编写以下内容:
注意:下面的 TOOLCHAIN_DIR 是上面交叉编译环境配置里面强调需要记住的路径。
#!/bin/bash
# 定义变量
# 设置x264的安装位置
PREFIX="./x264build"
# 交叉编译器bin路径,使用aarch64-linux-gnu-gcc -v命令查看
TOOLCHAIN_DIR="/opt/gcc-aarch64-linux-gnu/bin"
# 工具链前缀,用于指定交叉编译工具的路径
TOOLCHAIN="$TOOLCHAIN_DIR/aarch64-linux-gnu-"
# 运行 configure 脚本
echo "正在配置 x264..."
./configure \
--prefix=$PREFIX \
--disable-asm \
--enable-shared \
--enable-static \
--host=aarch64-linux-gnu \
--cross-prefix=$TOOLCHAIN \
--enable-pic
# 检查 configure 的返回状态
if [ $? -ne 0 ]; then
echo "错误:配置 x264 失败。"
exit 1
else
echo "配置成功。"
fi
# 编译 x264
echo "正在编译 x264..."
# 使用 nproc 获取处理器核心数,以确定并行编译的进程数
make -j$(nproc)
# 检查编译的返回状态
if [ $? -ne 0 ]; then
echo "错误:编译 x264 失败。"
exit 1
else
echo "编译成功。"
fi
# 安装 x264
echo "正在安装 x264..."
make install
# 检查安装的返回状态
if [ $? -ne 0 ]; then
echo "错误:安装 x264 失败。"
exit 1
else
echo "安装成功。"
fi
# 清理构建目录
echo "正在清理..."
make clean
# 检查清理的返回状态
if [ $? -ne 0 ]; then
echo "警告:清理构建目录失败。"
else
echo "构建过程完成。"
fi
# 脚本正常退出
exit 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
点击保存:
然后关闭文件。
给autoConfig.sh运行权限:
chmod +x autoConfig.sh
运行autoConfig.sh脚本:
./autoConfig.sh
下面这样就是成功了:
我们还可以在x264/x264build文件夹中找到相关的文件夹:
我们获取安装目录的绝对路径:pwd
WARNING
📌 记住这个路径,我们后面编译ffmpeg的时候要用!!!
注意:这是我的路径,每个人的路径都有所不同,一定要输入pwd查看!!!
3、下载瑞芯微ffmpeg源码
返回到x264的上层目录:
然后使用命令拉取瑞芯微ffmpeg源码:
git clone https://gitclone.com/github.com/nyanmisaka/ffmpeg-rockchip.git
4、交叉编译ffmpeg
进入ffmpeg-rockchip目录下:
cd ffmpeg-rockchip
新建一个ffmpeg_rk_build文件夹用来存放安装的文件和文件夹:
mkdir ffmpeg_rk_build
创建一个autoConfig.sh脚本:
touch autoConfig.sh
编辑autoConfig.sh脚本:
gedit autoConfig.sh
在autoConfig.sh脚本中编写如下内容:
X264_BUILD_DIR 的路径在前面 交叉编译X264 已经使用 pwd 查看过了,直接复制粘贴就行,一定要更改!!一定要更改!!一定要更改!!每个人的路径都不太一样!!!
# 定义前缀目录
PREFIX="./ffmpeg_rk_build"
# x264安装目录的绝对路径
X264_BUILD_DIR="/home/lipeng/share/TaiShanPai/x264/x264build"
# x264安装目录中include目录绝对路径
X264_INCLUDE_DIR="$X264_BUILD_DIR/include"
# x264安装目录中lib目录绝对路径
X264_LIB_DIR="$X264_BUILD_DIR/lib"
# 设置 PKG_CONFIG_PATH 环境变量
export PKG_CONFIG_PATH=$X264_LIB_DIR/pkgconfig:$PKG_CONFIG_PATH
echo "配置环境变量:"
echo "export PKG_CONFIG_PATH=$X264_LIB_DIR/pkgconfig:$PKG_CONFIG_PATH"
echo "正在配置./configure..."
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--enable-cross-compile \
--arch=arm64 \
--disable-stripping \
--target-os=linux \
--cc=aarch64-linux-gnu-gcc \
--enable-libx264 \
--extra-cflags=-I$X264_INCLUDE_DIR \
--extra-ldflags=-L$X264_LIB_DIR \
--pkg-config-flags="--static" \
--extra-libs="-lpthread -lm" \
--enable-gpl \
--enable-pic \
--enable-nonfree \
--enable-pthreads
# 检查 ./configure 是否成功
if [ $? -eq 0 ]; then
echo "./configure配置成功!"
else
echo "./configure配置失败!请检查您的环境!!!"
fi
# 运行 make
echo "正在编译 ffmpeg-rockchip..."
# 使用 nproc 获取处理器核心数,以确定并行编译的进程数
make -j$(nproc)
if [ $? -eq 0 ]; then
echo "Make成功!!!"
else
echo "Make失败!!请检查错误信息,清除错误之后再次尝试!!"
exit 1
fi
# 运行 make install
echo "正在安装 ffmpeg-rockchip..."
make install
if [ $? -eq 0 ]; then
echo "Make intall 安装成功!!!!"
echo "============================================="
echo "ffmpeg_rk 被安装在$PREFIX!"
echo "============================================="
else
echo "Make install 安装失败!!请检查错误信息,清除错误之后再次尝试!!"
exit 1
fi
# 清理构建目录
echo "正在清理..."
make clean
# 检查清理的返回状态
if [ $? -ne 0 ]; then
echo "警告:清理构建目录失败。"
else
echo "构建过程完成。"
fi
# 脚本正常退出
exit 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
然后点击保存:
给autoConfig.sh脚本添加运行权限:
chmod +x autoConfig.sh
然后运行autoConfig.sh脚本:
./autoConfig.sh
我们进入ffmpeg_rk_build目录下,可以看到相关的文件夹:
cd ./ffmpeg_rk_build/
四、将x264和ffmpeg转移到泰山派
我们接下来无论使用转移工具都可以,只要能把相关的文件转移到泰山派开发板!! 我使用的是U盘转移。
1、转移x264
将 /x264/x264build/bin 文件夹中的所有内容全部复制到开发板的 /usr/bin/ 目录下
将 /x264/x264build/lib 文件夹中的所有内容全部复制到开发板的 /usr/lib/ 目录下
2、转移ffmpeg
将 /ffmpeg-rockchip/ffmpeg_rk_build/bin 文件夹中的所有内容全部复制到开发板的 /usr/bin/ 目录下
将 /ffmpeg-rockchip/ffmpeg_rk_build/lib 文件夹中的所有内容全部复制到开发板的 /usr/lib/ 目录下
五、测试
x264测试
x264 --help
ffmpeg测试
查看版本信息:
ffmpeg -version
视频录制测试
软件解码性能不太够,所以做了性能的格式的限制。 这里定时录制一个5秒的视频!
ffmpeg -f v4l2 -i /dev/video0 -vf scale=960:540 -c:v libx264 -preset ultrafast -tune zerolatency -crf 30 -b:v 50k -r 15 -t 5 output.mp4
-f v4l2
:这个选项告诉ffmpeg
输入流的格式。v4l2
指的是Video for Linux 2
,它是Linux
下视频设备的驱动程序接口。这表示ffmpeg
将以v4l2
格式读取视频流。-i /dev/video0
:这是输入文件或设备的指定。在本例中,/dev/video0
是一个指向视频设备的文件名,通常是连接到系统的USB
摄像头或板载摄像头。-vf scale=960:540
:这表示视频过滤器(vf
代表video filter
)。scale
过滤器用于改变视频的尺寸。这里的960:540
是指输出视频的宽度和高度,将视频缩放到960x540
像素。-c:v libx264
:这指定了视频编码器。c:v
是codec:video
的简写,libx264
是一个高质量的H.264
视频编码库。这表示视频流将使用libx264
进行编码。-preset ultrafast
:这设置了编码预设。ultrafast
预设用于尽可能快的编码,牺牲了一定的压缩效率。这对于实时应用或资源有限的设备是非常有用的。-tune zerolatency
:这个选项用于调优编码器,使其更适合低延迟的应用。这通常会进一步牺牲压缩效率以提高响应速度。-crf 30
:crf
代表恒定速率因子,是libx264
特有的一个选项,用于在视频质量和文件大小之间做平衡。数值越低,视频质量越好,文件也越大。30
是一个相对较高的值,意味着视频质量会被牺牲以减少文件大小和编码时间。-b:v 50k
:这设置了视频比特率。50k
是指视频编码的最大平均比特率为50
千比特每秒。较低的比特率可以减少文件大小,但通常会导致视频质量下降。-r 15
:这设置了视频帧率。15
意味着视频将被编码为每秒15帧。降低帧率可以减少CPU负担和文件大小。-t 5
:这设置了视频的持续时间。5
意味着视频将被编码为5
秒的长度。这对于测试和调试非常有用,因为它可以防止无限期的编码。output.mp4
:这是输出文件名。ffmpeg
将把编码后的视频保存到名为output.mp4
的MP4
文件中。
我们就可以在windows电脑上面播放output.mp4这个视频文件。
如果你已经为开发板连接上了屏幕(我这里连接了HDMI)屏幕,可以直接运行下面的命令再屏幕上面播放这个MP4视频文件:
gst-launch-1.0 filesrc location=output.mp4 ! decodebin ! autovideosink