python实现实时视频流播放代码实例


Posted in Python onJanuary 11, 2020

这篇文章主要介绍了python实现实时视频流播放代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

@action(methods=['GET'], detail=True)
  def video(self, request, pk=None):
    """
    获取设备实时视频流
    :param request:
    :param pk:
    :return:
    """
    device_obj = self.get_object()

    # if device_obj.status == 0:
    #   return Response({'error': '设备离线'})

    if not device_obj.rtsp_address:
      return Response({'error': '缺少rtsp地址'})

    cache_id = '_video_stream_{}'.format(device_obj.hash)
    cache_status = cache.get(cache_id, None)
    if cache_status is None: # 任务初始化,设置初始时间
      cache.set(cache_id, time.time(), timeout=60)

    elif isinstance(cache_status, float) and time.time() - cache_status > 30: # 任务已超时, 返回错误信息, 一段时间内不再入队
      return Response({'error': '连接数目超过限制, 请稍后再试'})

    ret = job_queue.enqueue_video(rtsp_address=device_obj.rtsp_address, device_hash=device_obj.hash)

    logger.info('fetch device %s video job status: %s', pk, ret._status)

    if ret._status == b'started' or 'started': # 视频流正常推送中, 刷新播放时间, 返回视频ID
      cache.set(cache_id, 'continue', timeout=30)
      return Response({'video': ''.join([settings.FFMPEG_VIDEO, device_obj.hash])})

    elif ret._status == b'queued' or 'queued': # 视频任务等待中
      return Response({'status': '等待建立视频连接'})

    else: # 建立视频任务失败
      return Response({'error': '打开视频失败'})
class JobQueue:
  """实时视频播放"""
  def __init__(self):
    self.video_queue = django_rq.get_queue('video') # 视频推流消息队列

  def enqueue_video(self, rtsp_address, device_hash):
    """视频流队列"""
    job_id = 'video_{}'.format(device_hash)
    job = self.video_queue.fetch_job(job_id)

    if not job:
      job = self.video_queue.enqueue_call(
        func='utils.ffmpeg.ffmpeg_play',
        args=(rtsp_address, device_hash),
        timeout=-1,
        ttl=30, # 最多等待30秒
        result_ttl=0,
        job_id=job_id
      )

    return job
# -*- coding: utf-8 -*-

import subprocess
import threading
import time
import logging

from django.core.cache import cache


logger = logging.getLogger('server.default')


def ffmpeg_play(stream, name):

  play = True
  cache_id = '_video_stream_{}'.format(name)
  cache.set(cache_id, 'continue', timeout=30)
  process = None

  def upstream():
    cmd = "ffmpeg -i '{}' -c:v h264 -f flv -r 25 -an 'rtmp://127.0.0.1:1935/live/{}'".format(stream, name)
    process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL)
    try:
      logger.info('device: {} stream thread start: {}'.format(name, stream))
      while play:
        time.sleep(1)

    except Exception as e:
      logger.info('device: {} stream thread error {}'.format(name, e))

    finally:
      logger.info('device: {} stream thread stop'.format(name))
      process.communicate(b'q')

  thr = threading.Thread(target=upstream)
  thr.start()

  try:
    while True:
      play = cache.get(cache_id, '')
      if play != 'continue':
        logger.info('stop device {} video stream'.format(name))
        play = False
        break
      time.sleep(1)

  except Exception as e:
    logger.info('device: {} play stream error {}'.format(name, e))
    process.communicate(b'q')

  logger.info('wait device {} video thread stop'.format(name))
  thr.join()
  logger.info('device {} video job stop'.format(name))
# 实时视频流播放
RQ_QUEUES = {
  'video': {
    'USE_REDIS_CACHE': 'video',
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python采集腾讯新闻实例
Jul 10 Python
python生成随机图形验证码详解
Nov 08 Python
django反向解析和正向解析的方式
Jun 05 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Python 使用type来定义类的实现
Nov 19 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 Python
python 递归相关知识总结
Mar 03 Python
python3下pygame如何实现显示中文
Jan 11 #Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 #Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 #Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 #Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 #Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 #Python
Pytorch 保存模型生成图片方式
Jan 10 #Python
You might like
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
XmlUtils JS操作XML工具类
2009/10/01 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
浅析JS运动
2015/12/28 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
编辑个人求职信范文
2013/09/21 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
团日活动总结格式
2015/05/11 职场文书
就业指导讲座心得体会
2016/01/15 职场文书