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判断字符串与大小写转换
Jun 08 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
python版微信跳一跳游戏辅助
Jan 11 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
python3实现猜数字游戏
Dec 07 Python
详解Django 时间与时区设置问题
Jul 23 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
Python模块相关知识点小结
Mar 09 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
python如何实现图片压缩
Sep 11 Python
Python实现Hash算法
Mar 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 日期时间函数的高级应用技巧
2009/10/10 PHP
Wordpress php 分页代码
2009/10/21 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
CSS和Javascript简单复习资料
2010/06/29 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
详解Python循环作用域与闭包
2019/03/21 Python
python实现数据分析与建模
2019/07/11 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
计算机专业个人求职信范例
2013/09/23 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
教师申诉制度
2014/01/29 职场文书
项目经理任命书内容
2014/06/06 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
大学生毕业个人总结
2015/02/15 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
检举信的写法
2019/04/10 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Python 匹配文本并在其上一行追加文本
2022/05/11 Python