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导出DBF文件到Excel的方法
Jul 25 Python
详解python中executemany和序列的使用方法
Aug 12 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
python实现低通滤波器代码
Feb 26 Python
用python写爬虫简单吗
Jul 28 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 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速度快类库
2007/03/31 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
Python 文件读写操作实例详解
2014/03/12 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
python dict如何定义
2020/09/02 Python
python之语音识别speech模块
2020/09/09 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
十佳文明家庭事迹
2014/05/25 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技