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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
Python中用Spark模块的使用教程
Apr 13 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python中的urllib模块使用详解
Jul 07 Python
python中hashlib模块用法示例
Oct 30 Python
使用Django和Python创建Json response的方法
Mar 26 Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
Python 项目转化为so文件实例
Dec 23 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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 exif扩展方法开启详解
2014/07/28 PHP
php实现的ping端口函数实例
2014/11/12 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
食品安全工作方案
2014/05/07 职场文书
新品发布会策划方案
2014/06/08 职场文书
学生检讨书如何写
2014/10/30 职场文书
保留意见审计报告
2015/06/05 职场文书
GPU服务器的多用户配置方法
2022/07/07 Servers