树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示

闲的无聊突然想做树莓派小车,构想是主机端python程序可以实时看到树莓派摄像头图像,并可以控制小车方向移动等功能。

树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示_第1张图片树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示_第2张图片

 主机端使用opencv调用树莓派摄像头,代码差不多这个样子

import cv2
import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk#图像控件

url = "rtsp://192.168.0.117:9554/webcam"     #关键点在这个地方,树莓派通过rtsp传输
cap = cv2.VideoCapture(url)#创建摄像头对象
#界面画布更新图像
def tkImage():
    ref,frame=cap.read()
    frame = cv2.flip(frame, 1) #摄像头翻转
    cvimage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    pilImage=Image.fromarray(cvimage)
    pilImage = pilImage.resize((image_width, image_height),Image.ANTIALIAS)
    tkImage =  ImageTk.PhotoImage(image=pilImage)
    return tkImage
top = tk.Tk()
top.title('CAR')
top.geometry('900x600')
image_width = 600
image_height = 500
canvas = Canvas(top,bg = 'white',width = image_width,height = image_height )#绘制画布
Label(top,text = '摄像头视频',font = ("黑体",14),width =15,height = 1).place(x =400,y = 20,anchor = 'nw')
canvas.place(x = 150,y = 50)
while True:
  pic = tkImage()
  canvas.create_image(0,0,anchor = 'nw',image = pic)
  top.update()
  top.after(100)

cap.release()
top.mainloop()  

 本文关键就是哪个url如何得到!

————————————————分割线————————————————

正文开始

声明主要参考文献:

1、https://blog.csdn.net/u013062192/article/details/80210166

2、https://blog.csdn.net/a805995924/article/details/39435261

本文整合多篇参考文献,因为以前教程都是n年前的,本人站在先辈肩膀上,实现此功能。

第一步:安装live555

1、下载live555,地址:http://live555.com/liveMedia/public/live555-latest.tar.gz

树莓派可直接命令行(建议新建文件夹,方便后期更改目录,第一段代码是在根目录下建立live555文件夹,若是不想建立,直接第三行就ok)

mkdir /live555

cd /live555

wget http://live555.com/liveMedia/public/live555-latest.tar.gz

 2、解压

tar -zxvf live555-latest.tar.gz

 3、编译安装

cd live

sudo ./genMakefiles linux

sudo make

sudo make install

 第一步基本不会出错。

第二步:安装库文件

sudo apt-get install libavcodec-dev

sudo apt-get install libswscale-dev

sudo apt-get install libavutil-dev

第三步:编译安装ffmpeg与libx264

1、准备文件(建议下载至第一步创建的文件夹 /live555 中)

①、ffmpeg源码

GitHub地址:https://github.com/FFmpeg/FFmpeg.git

可在树莓派直接命令行(不能科学上网可在笔记本下载,然后发送到树莓派端)

git clone git://github.com/FFmpeg/FFmpeg.git

②、x264源码

GitHub地址:https://github.com/mirror/x264.git

可在树莓派直接命令行(不能科学上网可在笔记本下载,然后发送到树莓派端)

git clone git://github.com/mirror/x264.git

③、yasm源码

下载地址:http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

2、编译安装

①、安装yasm

tar zxvf yasm-1.3.0.tar.gz 

cd yasm-1.3.0

./configure 

make

make install

yasm --version

安装成功标志是可以成功查看版本号。

②、编译安装x264

先解压压缩文件,我第二段代码重命名了一下,方便后续操作,这地方重不重命名都可以。打开对应文件夹即可。

unzip x264-master.zip

mv x264-master x264

cd x264

开始编译,正确写法

./configure \
    --prefix=${DEST_LIB_DIR} \
    --enable-shared

然后(没管理员权限自己获取)

make

make install

③、编译ffmpeg

解压FFmpeg-master.zip(这个地方我重命名了一下,重不重命名都可以)

unzip FFmpeg-master.zip

mv FFmpeg-master ffmpeg

cd ffmpeg

打开所在目录下

./configure --enable-libx264 --enable-gpl --enable-shared  --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --enable-pic

make

make install

如果出现以下错误(正常操作不会遇到)

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

解决办法:

则需要修改文件:/etc/ld.so.conf

在文件尾添加一行:

/usr/local/lib

然后执行命令:

ldconfig

重新运行ffmpeg -encoders | grep x264会发现安装成功

第四步:编译执行工具

1、下载源码

Gitee源码地址:https://gitee.com/secho1997/live_camera_linux.git

主机下载源码之后传输至树莓派端,树莓派将源码复制到/opt/vc/src/hello_pi/目录下

2、解压源码(文件名称看实际情况)

unzip secho1997-live_camera_linux-master.zip

3、阅读hello_pi文件夹下的README

树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示_第3张图片

 按照提示,build the libs

make -C libs/ilclient

make -C libs/vgfont

完成此步之后进入live_camera_linux文件夹

cd live_camera_linux

阅读live_camera_linux文件下的README

树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示_第4张图片

 按照他说的安装软件开发包(没管理员命令的自己获取)

sudo apt-get install libavcodec-dev
sudo apt-get install libswscale-dev
sudo apt-get install libavutil-dev
sudo apt-get install libx264-dev

然后尝试编译

cd live_camera_linux

sudo make

sudo make install

sudo ./zk_v4l2_x264_source

是不是报错了?正常,哈哈。

错误一:

make: *** 没有规则可制作目标“/home/pi/live/liveMedia/libliveMedia.a”,由“zk_v4l2_x264_source” 需求。 停止。

此错误查看下文第一个坑

错误二:

gcc -L/opt/vc/lib -lEGL -lGLESv2 -ljpeg -shared -o libshapes.so oglinit.o libshapes.o
/usr/bin/ld: cannot find -lEGL
/usr/bin/ld: cannot find -lGLESv2
collect2: error: ld returned 1 exit status
Makefile:35: recipe for target 'library' failed
make: *** [library] Error 1

 此错误查看下文第三个坑

出现其他错误,就按照第二个坑和第四个坑修补,全都补上!

补坑秘籍:

查看live_camera_linux文件夹下的Makefile文件

树莓派CSI摄像头实现rtsp流的传输,笔记本使用Python调用Opencv显示_第5张图片

此处四个坑

第一个:要把第一步安装的live555的正确安装位置写上。

第二个:在INCLUDES后面加上(别忘了上一行末尾加个 \ 反斜杠这个东西,图中是正确示范)

-I/opt/vc/src/hello_pi/libs/ilclient

第三个:由于年代久远和版本更替,为了避免不同版本发生冲突,一些关键字的名称发生了变化,此处将原来的

-lEGL -lGLESv2

改为

-lbrcmEGL -lbrcmGLESv2

第四个:LDFLAGS(也就是第三步修改的那一行末尾)后面加上(先空格再加!)

-lssl -lcrypto

OK,填上四个坑,问题得以解决。

然后可以试试重新编译

sudo make

sudo make install

sudo ./zk_v4l2_x264_source

注意:sudo make install这一步成不成功无所谓,主要是看live_camera_linux  目录下有没有多一个zk_v4l2_x264_source(没有后缀)这个文件,有这个文件就好说。直接

sudo ./zk_v4l2_x264_source

运行就行。

成功出现以下内容则成功

[3278] WebcamOndemandMediaSubsession .... calling
using url "rtsp://192.168.0.117:9554/webcam"

然后成功效果图如下:

 如果没成功说明前面步骤不太对,仔细观察。

总结

整这玩意花了我一天时间,可愁死我了。因为网上文章都太过久远,目前来说错误很多,我根据前人写的很多经验,写出了本贴,希望本贴可以节约读者时间。

ps:这玩意延迟很大,少说要有三秒,还不如mjpg。mjpg传送门

你可能感兴趣的:(树莓派,linux,rtsp)