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通过ftplib登录到ftp服务器的方法
May 08 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
python解决字符串倒序输出的问题
Jun 25 Python
django+mysql的使用示例
Nov 23 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python音频处理的示例详解
Dec 23 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
MVC模式的PHP实现
2006/10/09 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
js left,right,mid函数
2008/06/10 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
在Django中创建第一个静态视图
2015/07/15 Python
Python处理中文标点符号大集合
2018/05/14 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
九年级历史教学反思
2014/01/27 职场文书
标准化管理实施方案
2014/02/25 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis
用Python可视化新冠疫情数据
2022/01/18 Python
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python