泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

儿童Linux系统,可打字编程学数理化
请稍侯

RISC-V AI 开发:使用 ffmpeg 和 D1 开发板进行直播推流

JinWen Zhou 创作于 2022/11/17

Corrector: TinyCorrect v0.1-rc3 - [spaces] Author: Jinwen Zhou zhoujwtony@163.com Date: 2022/09/08 Revisor: Falcon falcon@tinylab.org Project: RISC-V Linux 内核剖析 Sponsor: PLCT Lab, ISCAS

前言

前面两篇文章介绍了 D1 开发板开机入门和使用 D1 实现摄像头实时人体识别功能,这篇文章介绍如何在 D1 开发板上使用 ffmpeg 进行直播推流,因为我们实现的开发板摄像头应用需要实现对摄像头进行直播推流的功能。下面首先介绍如何在开发板上部署 ffmpeg,该模块可将视频推流至服务器上;然后介绍在虚拟机里安装并部署 Nginx-RTMP 服务器,接受来自 ffmpeg 的网络流;最后在电脑上使用一个拉流软件,从服务器上拉取观看视频。

D1 开发板 ffmpeg 编译安装

首先,D1 SDK 1.0 版本可直接支持 ffmpeg 的,编译使用即可,但 D1 SDK 目前已经升级到了 2.0 版本,2.0 已经不直接支持 ffmpeg,所以需要自己打个补丁,ffmpeg 补丁链接,下载后放到路径 tina/package/multimedia 下,在该路径下执行 mm 命令,编译结果的路径为 tina/out/d1-nezha/packages/target。将可执行文件 ffmpeg,以及它依赖的共享库文件拷贝到 D1 开发板上。

这里特别介绍一下如何找到 ffmpeg 所需的共享库文件。通常,可以直接用 ldd 命令快速列出来,或者直接采用静态编译的方式,把所有代码编译进同一个可执行文件。

不过,由于我在 D1 安装的系统中没有 ldd 命令,所以我在开发板上采用 ./ffmpeg 命令来执行,然后根据报错提示逐个找出来,最终在路径 tina/out/d1-nezha/packages/target/ffmpeg-4.3.1/ipkg-install/usr/lib 下找到了这些文件,之后,把它们拷贝到开发板的 /usr/lib 目录下即可:

libavcodec.so.58
libavdevice.so.58
libavfilter.so.7
libavformat.so.58
libavutil.so.56
libswresample.so.3
libswscale.so.5

准备好执行文件和共享库之后,再测试一下能否使用。插上摄像头并用下面这条命令将摄像头采集到的视频保存为 out.mp4,导入到电脑上看看录制视频是否正常。其中 -f 设置解析格式,-s 设置视频的宽和高,-i 表示输入参数:

$ ffmpeg -f video4linux2  -s 1280x720 -i /dev/video0 out.mp4

Nginx 编译安装

Nginx 是一个 Web 服务器,可以用于 HTTP 服务器、反向代理、负载均衡等场合,此处我们需要使用 Nginx-RTMP 作为直播服务端。

Nginx 支持多种平台,包括 Windows、Linux、macOS 等。本节以 Ubuntu 22.04 虚拟机为例,介绍如何安装 Nginx。

  • 下载 Nginx 1.16.0 源码。Nginx 下载地址
  • 解压缩,指令为 tar -zxvf nginx-1.16.0.tar.gz
  • 进入 Nginx 1.16.0 根目录 cd nginx-1.16.0
  • 执行 ./configure 命令,这一步可以增加参数,比如 ./configure --prefix=PATH,以便指定安装路径。更多参数可以输入 ./configure --help 查看。
  • 执行 ./configure 命令之后,目录中新增了 Makefile 文件,然后执行 make 命令进行编译。编译完成后,进入 objs 目录,就可以看到可执行文件 nginx
  • 执行 make install 命令安装 Nginx,这一步默认的安装路径为 /usr/local/nginx,进入该路径即可看到安装好的 Nginx
  • 启动 nginx,检测 nginx 是否能成功运行:sudo /usr/local/nginx/sbin/nginx,打开浏览器,输入主机对应的 IP 地址(输入 ifconfig 自行查看),即可看到 Nginx 欢迎页面。
  • 关闭 nginx,sudo /usr/local/nginx/sbin/nginx -s stop

nginx_hello.png

直播推流

Nginx-RTMP 是基于 Nginx 的 RTMP 媒体服务器,由 Nginx 和 nginx-rtmp-module 组成。下面使用 Nginx-RTMP 搭建媒体服务器,然后使用 ffmpeg 进行推流。

硬件准备

D1 开发板、一根 USB 线,一根串口线,一个 USB 摄像头,一根网线。

USB 线连接电源,串口线和网线连接电脑,USB 摄像头连接开发板 USB 口。

软件准备

之前的两篇文章介绍了开发板的系统编译安装和摄像头 demo 的运行,我们已经准备好了一个编译系统和一个运行系统,在此基础之上,安装了 nginx 和 ffmpeg,为了查看直播的画面,我们还需要下载一个可以捕获网络串流的媒体播放器,比如 VLC media player,在 Windows 安装即可。

VLC 下载地址

Nginx-RTMP 部署

nginx-rtmp-module 依赖 Nginx 的源代码,编译过程如下:

$ ls
nginx-1.16.0 nginx-rtmp-module
$ cd nginx-1.16.0
$ ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module
$ make
$ make install

要运行 RTMP 服务器,就要修改一下配置文件,默认的配置文件在 usr/local/nginx/conf/nginx.conf,可以直接修改其内容,或者再新建一个命名为 rtmp.conf,运行时指定一下配置文件即可,内容如下:

events {
    worker_connections 1024;
}
rtmp {
    server {
        listen 1935;
        application live {
            live on;
        }
    }
}

更多配置代码可见 RTMP 配置

编译及配置完成后,启动 Nginx-RTMP:

sudo /usr/local/nginx/sbin/nginx -c conf/rtmp.conf

ffmpeg 推流

给 D1 开发板上电,开机后输入以下内容,其中 IP 地址根据实际修改:

ffmpeg -f video4linux2 -s  1280x720 -i /dev/video0  -f flv rtmp://192.168.56.103/live/live

使用 VLC media player 拉流

打开 VLC media player,点击“媒体——>打开网络串流”,输入网络 URL: rtmp://172.168.2.86/live/live,能正常显示直播画面就成功了。

vlc.png

小结

至此,我们用 nginx 部署了简单的服务器,在 D1 开发板上使用 ffmpeg 进行直播推流,下一步将进行视频检测和推流的功能扩展和整合。

参考资料

  1. Nginx 下载地址
  2. VLC 下载地址
  3. ffmpeg 补丁链接
  4. RTMP 配置
  5. 《Nginx 底层设计与源码分析》


Read Album:

Read Related:

Read Latest: