本文章使用立创·泰山派RK3566进行讲解!
本文章针对Buildroot系统进行演示,有很多人都发现了,使用Buildroot系统直接在菜单里面勾选ffmpeg是不可以直接使用的!
会报错!!
Not a video capture device.
/dev/video0: No such device
接下来我们就来解决这个问题!!
出现上面的问题,原因也很简单,其实就是ffmpeg的版本类型不适合。
我们需要交叉编译瑞芯微版本的ffmpeg源码和x264软件解码,转移到开发板即可!
一、烧录镜像
首先我们需要在开发板里面烧录一个Buildroot系统,这部分卖开发板的商家肯定资料很全!!
二、配置交叉编译环境
这里立创的教程已经很全面了,直接按照教程里面的进行配置即可!!【共建】移植Qt5
在终端输入以下代码,查看自己的交叉环境配置是否成功,并且记住交叉编译工具的绝对路径:
aarch64-linux-gnu-gcc -v
框起来的就是自己电脑的交叉编译器工具路径,一定要记住!!后面要用!
三、交叉编译
1、下载x264源码
方法一【网址下载】:https://www.videolan.org/developers/x264.html
方法二【git拉取】(推荐)
我们这里就使用git命令拉取源码:
git clone https://code.videolan.org/videolan/x264.git
【没有git的可以下载一个】
2、交叉编译x264
进入x264目录下:
cd x264/
创建一个x264build文件夹,用来存放编译安装后的文件:
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
点击保存:
然后关闭文件。
给autoConfig.sh运行权限:
chmod +x autoConfig.sh
运行autoConfig.sh脚本:
./autoConfig.sh
下面这样就是成功了:
我们还可以在x264/x264build文件夹中找到相关的文件夹:
我们在x264build目录下获取安装目录的绝对路径:
pwd
记住这个路径,我们后面编译ffmpeg的时候要用!!!
注意:这是我的路径,每个人的路径都有所不同,一定要输入pwd查看!!!
3、下载瑞芯微版本ffmpeg源码
返回到x264的上层目录:
cd ..
然后使用git命令拉取瑞芯微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
然后点击保存:
给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
查看ffmepg:
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
注意事项
本文章只使用了Buildroot测试,对于Ubuntu和Debian系统,除了转移到开发板的步骤不一致,交叉编译的步骤应该都是一样的,各位读者可以尝试举一反三。