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‘,
    }
}

原文地址:https://www.cnblogs.com/52-qq/p/11812430.html

时间: 2024-08-05 01:43:11

python实时视频流播放的相关文章

使用HLS协议连接nginx实现近实时流方式播放视频

目录 1. 流媒体 1.1 流式传输 2. 点播 2.1 点播方案 2.2 什么是HLS 3. 视频编码 3.1 视频编码格式 3.2 FFmpeg 的基本使用 3.3 生成m3u8/ts文件 3.4 码率的设置 4. 播放器 4.1 技术选型 4.2 video.js 5. 开始配置nginx 6. 编写测试页面video.html 7. 测试 demo 地址 1. 流媒体 流媒体就是将视频文件分成许多小块儿,将这些小块儿作为数据包通过网络发送出去,实现一边传输视 频 数据 包一边观看视频.

使用Python实时获取cmd的输出

最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须想办法解决. (这是要搞死我的节奏啊....)由于个人不太懂他用的语言,只能在程序外围想办法. 环境描述: 1. 目标程序执行时会监听8080端口,TCP,并在每一次client连接后通过console输出client的IP地址. 2. 监听不是一次性完成的,而是一直监听,程序并不会退出 3. 为了

Python 实时日志平台 Sentry

原文地址:http://www.oschina.net/p/sentry Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建. Sentry 可以帮助你将 Python 程序的所有 exception 自动记录下来,然后在一个好用的 UI 上呈现和搜索.处理 exception 是每个程序的必要部分,所以 Sentry 也几乎可以说是所有项目的必备组件. getsentry / sentry Watch343 Star7457 Fork875 Sentry is a real

【android开发】实现语音数据实时采集/播放

最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码. 很多android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用于录制和播放音频.这个弊端在于他们不能实时采集并发送出去,所以,我们只能使用AudioRecord和AudioTrack来实现. 记得申明权限: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS&qu

python实时监控访问日志

需求:对nginx的访问日志进行实时的检查,如果恶意访问则添加到iptables列表中进行拒绝设置.//访问日志的格式为默认格式 ***正则表达式的zz_r变量中的关键字自行增减.目前在使用中....... 1 import os,sys 2 import subprocess 3 import re 4 5 6 #access_log='/usr/local/nginx/logs/http-access.log' 7 def monitor_log(access_log): 8 print('

rtmp直播视频流播放器(ckplayer)使用方法

摘要: 在我们编写项目时,也许会接触到一些视频的操作,普通视频流的话,例如Ogg.MPEG4.WebM这类后缀的文件,这几类文件都可以被h5的video标签解析,并不需要做解析操作,那么我们在项目中也会用到直播视频的格式,我在项目中就有涉及到直播的需求,是rtmp格式的直播视频流,起初我找了相关插件进行解析,有video.js插件包,还有ckplayer插件包,因为video.js没有深研究,所以使用的是ckpalyer,该插件能很好的解析rtmp格式的直播视频流,但是需要做一些配置: 第一步:

python实时过滤日志脚本

大神指导作品: #!/usr/bin/python#coding:utf8 from functools import wrapsfrom time import sleepimport os RESTART='pm2 restart ios-push' # coroutine 先要用 next 语句调用一次def coroutine(fn):    @wraps(fn)    def wrapper(*args,**kwargs):        ret=fn(*args,**kwargs) 

python 实时遍历日志文件

open 遍历一个大日志文件 使用 readlines() 还是 readline() ? 总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面. 但是 readlines() 会一次性把全部数据读到内存中,内存占用率会过高,readline() 每次只读一行,对于读取 大文件, 需要做出取舍. 如果不需要使用 seek() 定位偏移, for line in open('fi

python实时获取鼠标在桌面的位置

安装模块: pip install pyautogui import os,time import pyautogui as pag while True:       print "Press Ctrl-C to end"       x,y = pag.position()       pos="Position:"+str(x).rjust(4)+','+str(y).rjust(4)       print pos       time.sleep(0.3)