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和shell变量互相传递的几种方法
Nov 20 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
python自动12306抢票软件实现代码
Feb 24 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
用python求一重积分和二重积分的例子
Dec 06 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
Python中的 Set 与 dict
Mar 13 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简单命令代码集锦
2007/09/24 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP加密解密类实例代码
2016/07/20 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
详解Python locals()的陷阱
2019/03/26 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
python如何支持并发方法详解
2020/07/25 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
企业出纳岗位职责
2014/03/12 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
宣传稿格式范文
2015/07/23 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫