文章目录

  • 一、安装FLASK、创建基本的环境
  • 二、创建视频流媒体服务器

有好几种方法可以流式传输视频。最好的(也是“更轻松”)方法是使用Miguel Grinberg开发的Flask。有关Flask如何执行此操作的详细说明,请参阅他的精彩教程:flask-video-streaming-revisited。 关于flask更简单的入门,大家可以参考《爱上Raspberry Pi》P176-180.

在这个教程中:Python Web服务器将借助Flask和树莓派。我们要更详细地了解了Flask是如何工作、如何实现Web服务器以及从传感器上捕获数据并在网页上显示其状态。在本教程中的第一部分就是发送到我们前端的数据的视频流。

创建一个Web服务器环境:
首先要做的是在你的树莓派上安装Flask。

一、安装FLASK、创建基本的环境

1、直接pip安装:

sudo pip install flask

2、当我们开始一个新项目时,最好的办法就是创建一个文件夹来保存你的文件。 例如:
回到主页,到你的工作目录:

cd ~
sudo mkdir flask
cd flask

3、新建一个文件夹保存我们的项目:

mkdir camwebserver

按照上面的命令,创建一个名为“camwebserver”的文件夹,将在这里保存我们的python脚本;

4、现在,在这个文件夹/home/pi/flask/camwebserver上,我们将创建两个子文件夹:静态的CSS、最终的JavaScript文件以及HTML文件的模板。 转到你的新创建的文件夹:

cd camwebserver
sudo mkdir static
sudo mkdir templates

5、最终的目录“树”,如下所示:

flask      #目录
|__camwebserver        #子目录├── static        #子目录└── templates    #子目录

基本环境算是搭建完成了!
接下来我们在创建好的环境下,用Python Web 服务器应用程序来流式传输视频。

二、创建视频流媒体服务器

1、首先,下载Miguel Grinberg的树莓派相机软件包:camera_pi.py,并将其保存在创建的目录camWebServer上。 (https://github.com/Mjrovai/Video-Streaming-with-Flask/blob/master/camWebServer/camera_pi.py)
代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  camera_pi.py
#
import time
import io
import threading
import picameraclass Camera(object):thread = None  # background thread that reads frames from cameraframe = None  # current frame is stored here by background threadlast_access = 0  # time of last client access to the cameradef initialize(self):if Camera.thread is None:# start background frame threadCamera.thread = threading.Thread(target=self._thread)Camera.thread.start()# wait until frames start to be availablewhile self.frame is None:time.sleep(0)def get_frame(self):Camera.last_access = time.time()self.initialize()return self.frame@classmethoddef _thread(cls):with picamera.PiCamera() as camera:# camera setupcamera.resolution = (320, 240)camera.hflip = Truecamera.vflip = True# let camera warm upcamera.start_preview()time.sleep(2)stream = io.BytesIO()for foo in camera.capture_continuous(stream, 'jpeg',use_video_port=True):# store framestream.seek(0)cls.frame = stream.read()# reset stream for next framestream.seek(0)stream.truncate()# if there hasn't been any clients asking for frames in# the last 10 seconds stop the threadif time.time() - cls.last_access > 10:breakcls.thread = None

这是我们项目的核心,Miguel的安装包相当的不错,大家可以先借鉴,之后再根据自己需求来调整。

2、现在,使用Flask,让我们调整原始的Miguel的web服务器应用程序(camapp.py),创建一个特定的python脚本来渲染我们的视频。我们将其命名为camapp.py:
代码如下:

from flask import Flask, render_template, Response# Raspberry Pi camera module (requires picamera package, developed by Miguel Grinberg)
from camera_pi import Cameraapp = Flask(__name__)@app.route('/')
def index():"""Video streaming home page."""return render_template('index.html')def gen(camera):"""Video streaming generator function."""while True:frame = camera.get_frame()yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')@app.route('/video_feed')
def video_feed():"""Video streaming route. Put this in the src attribute of an img tag."""return Response(gen(Camera()),mimetype='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':app.run(host='0.0.0.0', port =8080, debug=True, threaded=True)

3、以上脚本将我们的摄像机视频流式传输到index.html页面上,index.html文件代码如下所示:

<html><head><title>CFQ's Live Streaming</title><link rel="stylesheet" href='../static/style.css'/></head><body><h1>CFQ's Live Streaming</h1><h3><img src="{{ url_for('video_feed') }}" width="90%"></h3><hr><p> @2019/1/2 Developed by CFQ~</p></body>
</html>

index.html最重要的一行是:

<img src="{{ url_for('video_feed') }}" width="50%">

视频将会在这里“反馈”到我们的网页上。
4、还必须在静态目录中包含style.css文件,以便以这种形式获得上述结果;
style.css代码如下:

body{background: blue;color: yellow;padding:1%;text-align: center;
}

5、确保所有的文件都在正确的位置,所有数据更新后,检查一下我们的环境;
使用tree命令可以看到我们的文件目录如下所示:

pi@raspberrypi:~ $ pwd
/home/pi
pi@raspberrypi:~ $ tree flask
flask      #目录
├── camwebserver      # 一级子目录
│   ├── appcam.py      #文件
│   ├── camera_pi.py    #文件
│   ├── camera_pi.pyc
│   ├── static          #二级子目录
│   │   └── style.css    #文件
│   └── templates        #二级子目录
│       └── index.html    #文件

6、检查以上文件都创建好,为确保文件有执行的权限,建议将文件的权限都改为777。

cd flask
sudo chmod -R 777 camwebserver

7、在终端上运行python脚本:

cd camwebserver
sudo python appcam.py

运行成功之后看到如下输出:

pi@raspberrypi:~/flask $ cd camwebserver
pi@raspberrypi:~/flask/camwebserver $ ls
appcam.py  camera_pi.py  camera_pi.pyc  static  templates
pi@raspberrypi:~/flask/camwebserver $ sudo python appcam.py * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger pin code: 293-786-523

8、转到自己的网络中的任何浏览器,并输入 http://树莓派的IP地址:8080,就可以访问到我们的应用了,如下所示:

参考文档:http://shumeipai.nxez.com/2018/07/03/video-streaming-web-server-with-flask.html?tdsourcetag=s_pctim_aiomsg

树莓派(十三)——使用flask创建视频流媒体服务器相关推荐

  1. python打造流媒体服务器_使用Flask搭建一个流媒体服务器

    摘要 收到前不久订阅的PythonWeekly发过来的一个邮件通知,由Miguel写的一篇介绍如何使用Flask搭建一个流媒体服务器的文章,思路很新颖也很有意思.你可以点击这里阅读英文原文.或者跟随本 ...

  2. 使用Flask搭建一个流媒体服务器

    摘要 收到前不久订阅的PythonWeekly发过来的一个邮件通知,由Miguel写的一篇介绍如何使用Flask搭建一个流媒体服务器的文章,思路很新颖也很有意思.你可以点击这里阅读英文原文.或者跟随本 ...

  3. 流媒体服务器在大屏系统,视频流媒体服务器

    视频流媒体服务器 内容精选 换一换 音视频传输协议众多, 不同业务应该如何选择? RTSP.RTMP.RTP/RTC.HLS.MSS.DASH.WEBRTC.RIST.SRT:在此我们就从业务发展的视 ...

  4. 国标GB/T28181视频流媒体服务器4G摄像头视频无插件直播方案对接过程中前端设备正常上线但视频无法播放问题解决

    背景分析 2012年6月1日,由公安部牵头起草的GB/T28181-2011 <安全防范视频监控联网系统信息传输.交换.控制技术要求>正式发布实施.要将全国视频统一联网,制定统一的国家标准 ...

  5. 安防4G摄像头视频流媒体服务器EasyNVR关于视频集成自我展示web端嵌入视频广场的流程

    背景分析 随着互联网基础设施建设的发展,4G/5G/NB-IoT各种网络技术的大规模商用,视频随时随地可看.可控的诉求越来越多,互联网思维.架构和技术引入进传统监控行业里,成为新形势下全终端监控的基础 ...

  6. 安防互联网摄像头海康大华硬盘录像机视频流媒体服务器EasyNVR在layer弹出层中使用video标签无法最大化全屏播放问题解决

    诞生背景 众所周知,EasyNVR可以将局域网/广域网上的海康/大华等网络摄像头由rtsp转换为rtmp.rtsp.hls.flv协议转换,并提供推流服务,可以将拉到的网络摄像头直接转发到流媒体服务器 ...

  7. 安防视频流媒体服务器Easy NVR搭建之DASH直播平台的搭建需要具备哪些条件?

    当前,全球各大视频网站均在抛弃陈旧的Flash播放技术,转而向Dash这种新型的流媒体传输方式靠拢.比如,Youtube,Hulu,Twitch,Netflix,Xvideos,PornHub,xHa ...

  8. GB/T28181国标视频流媒体服务器EasyGBS流媒体服务器设备注册成功却无法播放问题解析

    背景分析 2012年6月1日,由公安部牵头起草的GB/T28181-2011 <安全防范视频监控联网系统信息传输.交换.控制技术要求>正式发布实施.要将全国视频统一联网,制定统一的国家标准 ...

  9. 直播延时是如何产生的?4G摄像头无插件播放视频流媒体服务器EasyDSS超低延时直播的实现方案

    随着直播的越来越普及,我们作为用户,对直播的要求也越来越高,比如超低延时直播,且支持手机和PC端直接播放,不安装任何播放插件.那么问题来了,如何实现低延迟.秒开的直播? 通过我们技术人员的考察,目前主 ...

最新文章

  1. 我对变量产生了这些想法
  2. TCP/IP详解--第六章
  3. c++期末大作业_西城的家长注意了,北京小学校内期末考试越来越重要
  4. 如果项目中如何添加或卸载某些组件
  5. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
  6. vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?
  7. 推荐系统: 数据、问题与算法
  8. SpringCloud创建Gateway模块
  9. 【SDOI2014】数表
  10. js 从一个json拼接成另一个json,并做json数据分页table展示
  11. 阿里巴巴分布式调度引擎tbschedule实战三tbschedule的调度原理
  12. 进销存管理系统搭建流程
  13. 入职东北国企做程序员一个月,感受如何?
  14. 电驴无限制 服务器,全球最大电驴服务器eDonkeyServer No2消失
  15. 界面自动化测试工具-Ksend
  16. python 字符串方法 replace_python字符串方法replace()简介
  17. excel 设置隔行变色功能
  18. Au 效果器详解:参数均衡器
  19. Qt编写可视化大屏电子看板系统5-恢复布局
  20. 解决js脚本加载失败的问题

热门文章

  1. i节点(inode)和文件描述符(file descriptor)的区别和联系
  2. 网络同步在游戏历史中的发展变化(三)—— 状态同步的发展历程与基本原理(上)...
  3. 深度:传统服装品牌大量进入,老年身体机能变化催生数千亿中老年服装市场!
  4. 【什么是渲染目标(render target)】
  5. 算法工程师-机器学习-数据科学家面试准备[外企和国外公司、春招、秋招]
  6. [转载] 钢铁是怎样炼成的——第一部第一章
  7. 利用Python来制作一个中英互译器,并实现语音播报
  8. 如何用NLP技术和标题党说拜拜-文本摘要
  9. JEECG社区微信小程序开发实战-张代浩-专题视频课程
  10. convert转化函数的用法