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简单的制作图片验证码实例
May 31 Python
Flask数据库迁移简单介绍
Oct 24 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
python中类的属性和方法介绍
Nov 27 Python
python使用udp实现聊天器功能
Dec 10 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
Jan 29 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
python实现简单井字棋小游戏
Mar 05 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
如何在python中判断变量的类型
Jul 29 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 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 和 HTML
2006/10/09 PHP
php中$this->含义分析
2009/11/29 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
ASP SQL防注入的方法
2008/12/25 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
在pycharm中显示python画的图方法
2019/08/31 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
竞选班长的演讲稿
2014/04/24 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
刑事法律意见书
2015/06/04 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL