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利用IPython提高开发效率
Aug 10 Python
详解python进行mp3格式判断
Dec 23 Python
python负载均衡的简单实现方法
Feb 04 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
java中两个byte数组实现合并的示例
May 09 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
Pycharm如何运行.py文件的方法步骤
Mar 03 Python
详解pycharm配置python解释器的问题
Oct 15 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
初学Javascript的一些总结
2008/11/03 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
PHP守护进程实例
2015/03/06 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
基于python时间处理方法(详解)
2017/08/14 Python
Python实现的矩阵类实例
2017/08/22 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
pygame实现弹球游戏
2020/04/14 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
外贸业务员求职信范文
2013/12/12 职场文书
上课迟到检讨书
2014/02/19 职场文书
青春演讲稿范文
2014/05/08 职场文书
员工保密承诺书
2014/05/28 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android