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脚本监控docker容器
Apr 27 Python
Python常用知识点汇总
May 08 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Pandas中resample方法详解
Jul 02 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
golang特有程序结构入门教程
Jun 02 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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
详解jQuery中的事件
2016/12/14 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
python算法题 链表反转详解
2019/07/02 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
python退出循环的方法
2020/06/18 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
大学生求职推荐信
2013/11/27 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
优秀党员获奖感言
2014/02/18 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
本溪水洞导游词
2015/02/11 职场文书
护士2015年终工作总结
2015/04/29 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏