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获取豆瓣电影简介代码分享
Jan 16 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
Python 数据结构之队列的实现
Jan 22 Python
Python的装饰器使用详解
Jun 26 Python
Python字符串拼接的几种方法整理
Aug 02 Python
简单谈谈python中的语句和语法
Aug 10 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
python爬虫请求头设置代码
Jul 28 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
jQuery 表单验证扩展(四)
2010/10/20 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
python实现自动登录后台管理系统
2018/10/18 Python
Python3.4解释器用法简单示例
2019/03/22 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
大学班级文化建设方案
2014/05/06 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python