imx6ull 开发板 推流ov5640数据,虚拟机用 ffplay 拉流播放

Nginx 服务器:它是一个功能强大的Web 服务器。就像一个"万能的瑞士军刀",它不仅能提供静态网页,还能通过加载"模块"来扩展功能,比如加载一个 rtmp 模块,它就摇身一变,成了一个流媒体服务器。

RTMP (Real-Time Messaging Protocol):它是一种实时消息传输协议。它专门为低延迟、实时性的音视频流设计。它规定了数据应该如何打包、如何传输、如何建立连接。

imx6ull 开发板上,用FFmpeg推流:

  • 命令行一行搞定,不用写代码
  • 支持 V4L2 直接读摄像头
  • 支持 RTMP 推流
  • 参数丰富,后面可以调码率、分辨率、帧率

安装清单:

  1. Ubuntu 虚拟机 安装 nginx 和 rtmp 模块 , 安装 ffmpeg 。

  2. 开发板安装 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
相关推荐
Web3探索者21 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo1 天前
Linux系统中网线与USB网络共享冲突
linux
荣--2 天前
在 strip 二进制 + 基址随机化的栈里做崩溃去重 —— 三阶段算法与一行 Crash Flag
嵌入式·崩溃分析·栈指纹·去重算法
释然小师弟2 天前
Android开发十年:反思与回顾
android·后端·嵌入式
Sokach10152 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
FreakStudio3 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
AlfredZhao3 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3104 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒6 天前
TShark:Wireshark CLI 功能
linux