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 相关文章推荐
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
python开发之文件操作用法实例
Nov 13 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
python matplotlib画图实例代码分享
Dec 27 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
python deque模块简单使用代码实例
Mar 12 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python实现图片素描效果
Sep 26 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基础知识:控制结构
2006/12/13 PHP
php项目打包方法
2008/02/18 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
php通过各种函数判断0和空
2020/07/04 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
Js 中debug方式
2010/02/07 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
python字典的常用操作方法小结
2016/05/16 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
django迁移数据库错误问题解决
2019/07/29 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
Python实现京东抢秒杀功能
2021/01/25 Python
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
职务说明书范文
2014/05/07 职场文书
七夕情人节促销方案
2014/06/07 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫