Nginx 服务器它是一个功能强大的Web 服务器。就像一个“万能的瑞士军刀”它不仅能提供静态网页还能通过加载“模块”来扩展功能比如加载一个 rtmp 模块它就摇身一变成了一个流媒体服务器。RTMP(Real-Time Messaging Protocol)它是一种实时消息传输协议。它专门为低延迟、实时性的音视频流设计。它规定了数据应该如何打包、如何传输、如何建立连接。imx6ull 开发板上用FFmpeg推流命令行一行搞定不用写代码支持 V4L2 直接读摄像头支持 RTMP 推流参数丰富后面可以调码率、分辨率、帧率安装清单1. Ubuntu 虚拟机 安装 nginx 和 rtmp 模块 , 安装 ffmpeg 。2. 开发板安装 ffmpeg第一步虚拟机安装 nginx 和 rtmp 模块sudo apt updatesudo 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 updatesudo apt install ffmpeg验证安装ffmpeg -version第二步确保开发板上有 ffmpeg在开发板上输入 ffmpeg -version 看看有没有没有的话上一篇博客有 ffmpeg 安装教程。安装的 ffmpeg 本版不要太低功能不全有些参数不支持设置。确保开发板能 ping 通 Ubuntu 虚拟机的 IP第三步推流拉流 测试imx6ull 开发板, 执行推流命令320x240 15fpsffmpeg -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/testffplay 播放摄像头画面 延迟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,formatyuv420p 如果画面需要上下翻转 -pix_fmt yuv420p 改为 -vf vflip,hflip,formatyuv420p 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
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 updatesudo 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 updatesudo apt install ffmpeg验证安装ffmpeg -version第二步确保开发板上有 ffmpeg在开发板上输入 ffmpeg -version 看看有没有没有的话上一篇博客有 ffmpeg 安装教程。安装的 ffmpeg 本版不要太低功能不全有些参数不支持设置。确保开发板能 ping 通 Ubuntu 虚拟机的 IP第三步推流拉流 测试imx6ull 开发板, 执行推流命令320x240 15fpsffmpeg -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/testffplay 播放摄像头画面 延迟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,formatyuv420p 如果画面需要上下翻转 -pix_fmt yuv420p 改为 -vf vflip,hflip,formatyuv420p 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