Nginx 服务器:它是一个功能强大的Web 服务器。就像一个"万能的瑞士军刀",它不仅能提供静态网页,还能通过加载"模块"来扩展功能,比如加载一个 rtmp 模块,它就摇身一变,成了一个流媒体服务器。
RTMP (Real-Time Messaging Protocol):它是一种实时消息传输协议。它专门为低延迟、实时性的音视频流设计。它规定了数据应该如何打包、如何传输、如何建立连接。
imx6ull 开发板上,用FFmpeg推流:
- 命令行一行搞定,不用写代码
- 支持 V4L2 直接读摄像头
- 支持 RTMP 推流
- 参数丰富,后面可以调码率、分辨率、帧率
安装清单:
-
Ubuntu 虚拟机 安装 nginx 和 rtmp 模块 , 安装 ffmpeg 。
-
开发板安装 ffmpeg,
**第一步:**虚拟机安装 nginx 和 rtmp 模块:
sudo apt update
sudo apt install nginx libnginx-mod-rtmp
安装后,修改 nginx 配置,sudo vim /etc/nginx/nginx.conf
文件的最末尾(最后一个大括号 } 的外面),添加以下 RTMP 配置:
rtmp {
server {
listen 1935;
application live {
live on;
record off;
}
}
}

改完后,保存退出,
重启 nginx 服务使配置生效:
sudo systemctl restart nginx
然后,Ubuntu 虚拟机 安装 ffmpeg :
sudo apt update
sudo apt install ffmpeg
验证安装:ffmpeg -version
**第二步:**确保开发板上有 ffmpeg
在开发板上输入 ffmpeg -version 看看有没有,
没有的话,上一篇博客,有 ffmpeg 安装教程。安装的 ffmpeg 本版不要太低,功能不全,有些参数不支持设置。
确保开发板能 ping 通 Ubuntu 虚拟机的 IP
第三步:推流拉流 测试
imx6ull 开发板, 执行推流命令(320x240 ,15fps):
ffmpeg -f v4l2 -video_size 320x240 -framerate 15 -i /dev/video1 -q 10 -f flv rtmp://192.168.137.199:1935/live/test
参数 framerate:帧率 。
虚拟机用ffplay播放,拉流命令:
ffplay rtmp://192.168.137.199:1935/live/test
ffplay 播放摄像头画面 ,延迟6秒,此时,关闭开发板推流,再重新推流,反复几次,ffplay画面 延迟会小于1秒.
观察到的这个现象,精准地击中了直播流媒体技术中最核心的痛点:缓冲与同步机制。
RTMP 协议本身没有"绝对时间"的概念,它只负责把数据包按顺序发出去。延迟是"攒"出来的。
要实现真正的低延迟,必须两头一起掐:让推流端不攒数据,让拉流端丢弃旧数据。
第一步:在虚拟机终端,输入优化后的 ffplay 拉流命令
ffplay -fflags nobuffer -flags low_delay -framedrop rtmp://192.168.137.199:1935/live/test
- -fflags nobuffer:禁用 ffplay 的输入缓冲区,收到数据立刻解码显示,不"攒"。
- -flags low_delay:告诉解码器牺牲一切换取低延迟。
- -framedrop:如果解码来不及,允许丢帧追赶进度,绝不播放旧画面。
第二步:优化推流端(ffmpeg), 缩短关键帧间隔
测试 320x240 ,15fps, 码率200K .
推流拉流优化后,画面延迟非常低,不到1秒, imx6ull cpu 占用率 60%
推流命令:
(如果画面需要水平翻转: -pix_fmt yuv420p 改为 -vf "hflip,format=yuv420p" )
(如果画面需要上下翻转: -pix_fmt yuv420p 改为 -vf "vflip,hflip,format=yuv420p" )
ffmpeg -f v4l2 \
-framerate 15 \
-video_size 320x240 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 200k \
-f flv rtmp://192.168.137.199:1935/live/tes
接下来,测试其他的分辨率看看,修改推流命令,拉流不变:
测试 320x240 ,提高到 30fps, 码率 200k。
画面延迟 1秒, cpu 占用率 99%
ffmpeg -f v4l2 \
-framerate 30 \
-video_size 320x240 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 200k \
-f flv rtmp://192.168.137.199:1935/live/test
测试 480x272 ,15fps, ,码率提升到 350k。
画面延迟 小于1秒, imx6ull cpu 占用率 93%
推流命令:
ffmpeg -f v4l2 \
-framerate 15 \
-video_size 480x272 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 350k \
-f flv rtmp://192.168.137.199:1935/live/test
测试 480x272 ,30fps, ,码率 350k。
画面延迟 2秒, cpu 占用率是 99%
推流命令:
ffmpeg -f v4l2 \
-framerate 30 \
-video_size 480x272 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 350k \
-f flv rtmp://192.168.137.199:1935/live/test
测试 640x480 ,15fps, 像素数比 320x240 多 4 倍,码率提升到 600k。
画面延迟 5秒, cpu 占用率 99%
推流命令:
ffmpeg -f v4l2 \
-framerate 15 \
-video_size 640x480 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 600k \
-f flv rtmp://192.168.137.199:1935/live/test
测试 800x480 ,15fps,码率提升到 800k。
画面延迟 5秒, cpu 占用率是 99%
推流命令:
ffmpeg -f v4l2 \
-framerate 15 \
-video_size 800x480 \
-i /dev/video1 \
-c:v libx264 \
-pix_fmt yuv420p \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-g 15 \
-keyint_min 15 \
-b:v 800k \
-f flv rtmp://192.168.137.199:1935/live/test