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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
Python中的ConfigParser模块使用详解
May 04 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
python 图片去噪的方法示例
Jul 09 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
利用PyTorch实现VGG16教程
Jun 24 Python
python按照list中字典的某key去重的示例代码
Oct 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
一个捕获函数输出的函数
2007/02/14 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP中的use关键字概述
2014/07/23 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
django定期执行任务(实例讲解)
2017/11/03 Python
Python元组知识点总结
2019/02/18 Python
python3.x实现base64加密和解密
2019/03/28 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
python suds访问webservice服务实现
2020/06/26 Python
成语的广告词
2014/03/19 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
JS ES6异步解决方案
2021/04/29 Javascript
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python