有无数的指南描述如何从 Raspberry Pi 传输数据到某个地方,我不知何故迷失了方向,并且厌倦了尝试不同的配置。
我的资源:
- 树莓派相机 v2
- 树莓派 v3
- OpenWRT路由器
- 20 Mbit 上传光纤连接,带静态 IP
- 廉价 VPS,具有静态 IP (100/100 MBit)
- 一些常规的 Linux 技能。
我的目标:通过网络浏览器为一些客户获取来自摄像头的(公开)实时流。
这应该足以实现相当好的直播质量,但事实证明并不是那么容易。
首先,我尝试了 raspicam、netcat、mplayer——它们质量很差、不稳定,并且需要客户端使用二进制 mplayer。
然后我发现了 uv4l,它还不错,但并不完美。我要么通过 h264 二进制 mplayer 获得高质量流,要么通过 mjpeg 获得 1-2 fps 流,我使用了一些技巧将其嵌入到网站上的 iframe 中……它工作了一段时间,但它消耗了整个网络,对 CPU 的要求很高。
网站上的嵌入还不够完美。后来我遇到了 ffmpeg 解决方案。我目前的参数是:
ffmpeg -f video4linux2 -input_format h264 -video_size 1920x1080 -framerate 40 -i /dev/video0 -vcodec copy -codec:a copy -f ssegment -segment_list playlist.m3u8 -segment_list_type hls -segment_list_size 10 -segment_list_flags +live -segment_time 40 -sc_threshold 0 -segment_wrap 30 out%03d.ts
输出是 VPS 上的 NFSv4 挂载目录,服务器上有 apache2 和 flowplayer。
运行良好,但可以更好。
优点:
- 无论客户端数量多少,本地连接的负载都相同
- 我从 Raspberry Pi 硬件编码中获益
- 我获得了 40 fps、全高清
缺点:
- 由于段正在终止,因此需要通过 NFS 将其写入 VPS - 流因此阻塞。根据段的大小,流会冻结 3-15 秒(通过 NFS 写入文件所需的时间?)。
- 当 Pi 上传数据段时,网络上行变得饱和
- 流媒体中有几个片段(一两分钟)延迟
您建议至少采取什么措施来应对 1 和 2?我原本想“以另一种方式”执行 NFS,但不断写入 microSD 可能会损坏我的卡。
服务器上的 ffmpeg 是一个选项,但我可能没有足够的 CPU 能力来动态地对其进行转码。
我并不期待一个明确的、“正确且唯一的答案”,但会很感激能得到一些想法。