fpv图传遥控使用教程

一个很简单的APP的使用教程。

下载

https://github.com/h13-0/fpv-Remote-Control/releases

图传部分

针对图传部分,我只提供 Linux开发板 的配置方法,对于使用’esp-eyes’的请自行按照http/udp协议使用。

截止2020-08-10,无论是小白还是大佬,都推荐用 Motion 进行http图传。

http图传环境搭建

实测延迟0.2秒
这里以Motion为例,在Linux的Shell环境中:
先尝试:

1
sudo apt-get install motion

如果没有这个库的话 需要用源码安装
https://motion-project.github.io

1
2
make -j4
sudo make install

然后去/etc/motion/motion.conf里面正确选择cameraID,
输入:

1
sudo nano /etc/motion/motion.conf

没有nano文本编辑器的可自行安装或用vim替换

首先选择正确选择cameraID

1
2
3
4
5
6
7
###########################################################
# Capture device options
############################################################

# Videodevice to be used for capturing (default /dev/video0)
# for FreeBSD default is /dev/bktr0
videodevice /dev/video0

然后配置分辨率

1
2
3
4
5
# Image width (pixels). Valid range: Camera dependent, default: 352
width 640

# Image height (pixels). Valid range: Camera dependent, default: 288
height 480

帧率
摄像头捕获帧率:

1
2
3
4
5
6
7
8
# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 100

# Minimum time in seconds between capturing picture frames from the camera.
# Default: 0 = disabled - the capture rate is given by the camera framerate.
# This option is used when you want to capture images at a rate lower than 2 per second.
minimum_frame_time 30

视频流帧率:

1
2
# Maximum framerate for stream streams (default: 1)
stream_maxrate 30

图传端口

1
2
# The mini-http server listens to this port for requests (default: 0 = disabled)
stream_port 8081

关闭localhost限制

1
2
# Restrict stream connections to localhost only (default: on)
stream_localhost off
1
2
# Restrict control connections to localhost only (default: on)
webcontrol_localhost off

允许ipv6访问

1
2
# Enable or disable IPV6 for http control and stream (default: off )
ipv6_enabled on

等一切调试完毕, 开启后台运行模式

1
2
# Start in daemon (background) mode and release terminal (default: off)
daemon on

更多可配置项详见
https://www.jianshu.com/p/0e66d9b6b87d
然后如果能正常显示图传图像,则http图传配置部分完成。

UDP图传配置

目前无论是APP端还是Linux端UDP图传均未调试优化完毕,以下方案目前延迟在0.8秒左右
先说一下截止2020-08-10的udp图传方案吧。
Linux端主动向APP端发送UDP数据,然后APP端读取本地端口的UDP视频流播放。
但是Sever端主动向Client端发数据并不是很好的解决办法,不过这个问题以后再解决,目前主要需要先优化UDP图传的延迟和质量。

ffmpeg环境搭建

ffmpeg官网:
https://ffmpeg.org/

先试试你是否已经完全安装ffmpeg

1
ffmpeg -f video4linux2 -s 640*480 -i /dev/video0 -vcodec h264 -preset ultrafast -tune zerolatency -r 30 -b:v 1024K -movflags +faststart -f mpegts udp://127.0.0.1:8888 

注意, /dev/video0 是你摄像头的文件位置。
如果报错,请按照以下步骤执行。如果没有报错,请直接跳到UDP环节的最后一个步骤。

源码安装

建议从Github上下载源码到电脑再传到到Linux板子上并解压
https://github.com/FFmpeg/FFmpeg
,然后:

1
2
3
4
cd ffmpeg
./configure --enable-shared --enable-libx264 --enable-gpl
make #请自行根据Linux开发板性能开启多线程编译
sudo make install

如果肉身在墙外或者Linux开发板自带梯子的话,推荐直接使用官方git源

1
git clone https://git.ffmpeg.org/ffmpeg.git

来代替github下载步骤。
如果不知道怎么代替的话,建议忽略这一部分。

然后执行:

1
sudo ffmpeg -f video4linux2 -s 640*480 -i /dev/video0 -vcodec h264 -preset ultrafast -tune zerolatency -r 30 -b:v 1024K -movflags +faststart -f mpegts udp://你手机IP:8888 

报错&解决方案:

libavdevice.so.58:

即报错:

1
ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory

则原因为 未将 libavdevice.so.58 等依赖文件添加到path中。
输入:

1
ldd ffmpeg

查看对应缺失的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
ldd ffmpeg
libavdevice.so.58 => not found
libavfilter.so.7 => not found
libavformat.so.58 => not found
libavcodec.so.58 => not found
libpostproc.so.55 => not found
libswresample.so.3 => not found
libswscale.so.5 => not found
libavutil.so.56 => not found
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6ed8000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6eb4000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6dc7000)
/lib/ld-linux-armhf.so.3 (0xb6f76000)

然后

1
ls /usr/local/lib/libavdevice.so.58

一般上述文件都在这个目录里。

验证:

1
export LD_LIBRARY_PATH=/usr/local/lib/

这一个命令只是暂时性的把依赖目录加入当前Shell的环境变量中,重新打开Shell即失效,较为安全。
然后再次输入

1
ffmpeg

如果没有报错,请按照以下步骤执行:

1
sudo nano /etc/ld.so.conf

在文件中添加路径:

1
2
/usr/local/lib
sudo ldconfig

接下来加入全局环境变量路径:

1
sudo nano /etc/profile

下列命令具有非常高危险性,请仔细核对后再操作
在文档中加入:

1
export PATH="/usr/local/ffmpeg/bin:$PATH"

一定要注意加上最后的 “:$PATH” 不然你会丢失所有环境变量
然后保存并运行

1
source /etc/profile

丢失环境变量后的解决方法:
一定不要重启,一定不要关闭当前Shell

1
/usr/bin/vim /etc/profile

然后正确修改和保存后,

1
source /etc/profile
ERROR: libx264 not found:
1
ERROR: libx264 not found

则需要安装 libx264 编解码器。

则:

1
2
3
4
git clone [email protected]:videolan/x264.git
./configure --enable-shared --enable-pthread --enable-pic
make
sudo make install

然后再次执行回到ffmpeg目录再次从 ./configure --enable-shared --enable-libx264 --enable-gpl 开始执行即可。

can’t configure encoder

大概率是你 configure 的时候没有设置 --enable-libx264

make时报错:recompile with -fPIC

出现该现象的大致有两种原因
1.依赖库没有安装好
2.更改ffmpeg的 ./configure 后未清理上次编译缓存

对于1 请自行排坑
对于2 建议先执行 make clean 后再 make

对于源码安装的一些建议

并不是所有库都提供了可靠的卸载方式,所以建议将所有 sudo make install 替换为 checkinstall
他会自动帮你编译好的文件打包为 deb 或者 rpm 包,再用对应包管理器进行安装,方便卸载。
checkinstall安装:

1
apt install auto-apt checkinstall

使用:

1
2
3
4
./configure --enable-shared --enable-pthread --enable-pic
make
checkinstall
sudo dpkg -i xxx.deb

ffmpeg命令的官方文档

https://trac.ffmpeg.org/wiki/StreamingGuide

给几个昨晚我从里面扒到的几个比较有用的设置吧

一个最精简的UDP图传指令是这样的

1
ffmpeg -f video4linux2 -i /dev/video0 -vcodec h264 -acodec copy -f mpegts udp://你手机IP:8888

然后可以这样拆分:
ffmpeg -f video4linux2 -i /dev/video0 -vcodec h264 -f mpegts udp://你手机IP:8888

重要配置:
编码器零延迟,应加到 -vcodec h264

1
-tune zerolatency

预设超快速,应加到 -vcodec h264

1
-preset ultrafast

分辨率设置,应加到 -f video4linux2

1
-s 640*480

码率设置,应加到 -vcodec h264

1
-b:v 1024K

帧率设置,应加到 -vcodec h264

1
-r 30

允许快速连接,他会将一些重要的信息移动到文件头,可以让你在完全下载之前就开始播放,

1
-movflags +faststart

不过,就算这样折腾完,仍然有0.8秒的延迟…

中等重要配置:
I帧设置:

1
-keyint_min 15 -g 15 -sc_threshold 0 

最后,命令也就成了这样

1
sudo ffmpeg -f video4linux2 -s 640*480 -i /dev/video0 -vcodec h264 -preset ultrafast -tune zerolatency -r 30 -b:v 1024K -movflags +faststart -f mpegts udp://你手机IP:8888 

最后,送你一个 rtp 图传的配置,rtp也是基于udp,如果用rtp的话,接收端配置会复杂一些,并且效果和udp也没有明显区别,故这里不推荐

1
sudo ffmpeg -f video4linux2 -s 320*240 -i /dev/video0 -vcodec h264 -preset ultrafast -tune zerolatency -r 30 -b:v 1024K -movflags +faststart -f rtp rtp://192.168.1.154:8888 -itsscale 1

网络连接部分

本APP支持任何形式的网络连接,包括4G,WIFI等

4G连接

这里推荐使用Zerotier进行内网穿透连接而不推荐使用ipv6直连。

Zerotier

Zerotier官网:
https://www.zerotier.com/

Linux端

1
curl -s https://install.zerotier.com | sudo bash

然后创建和加入虚拟局域网。

APP接收端

去上文提到的’Zerotier’官网下载对应APP,创建和加入虚拟局域网即可。

ipv6访问

因为ipv6是动态变化的,并且ipv6的资源在ipv4下无法访问,故不推荐使用。
如果迫不得已一定要使用ipv6,则推荐相应DDNS工具绑定域名。

远程控制部分

本APP提供两种远控方案,TCP和蓝牙串口。其中Linux开发板上请使用TCP方式,单片机上可以配合蓝牙串口模块使用(推荐)也可以配合esp8266等使用TCP控制。

数据格式

其实不了解数据格式也不影响硬件部分的开发,所以没有什么兴趣的请自行略过。
开源地址:
https://github.com/h13-0/fpv-Remote-Control
http://www.h13studio.com/第一个安卓APP/

TCP

还没写完

蓝牙串口