python+ffmpeg视频并发直播压力测试


Posted in Python onMarch 06, 2018

通过python与ffmpeg结合使用,可生成进行视频点播、直播的压力测试脚本。可支持不同类型的视频流,比如rtmp或者hls形式。
通过如下方式执行脚本:python multiRealPlay.py [rtmp|http] [thread counts] [interval Time]
[rtmp | http]:视频播放的不同形式
[thread counts]:并发线程数
[interval Time]:启动每个线程的间隔时间

代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-  
'''
Created on 2015年7月22日

@author: LiBiao
'''
import datetime,time
import threading
import subprocess
import os, base64
import sys
import Queue

queue = Queue.Queue()


#需要手动配置的参数

#启动序号
SLEEP_TIME = 0

#直播地址
FULL_ADDR = {}

#需要手动配置的参数
RTMP_ADDR = 'rtmp://192.168.1.208:1935/live/'
HTTP_ADDR = 'http://192.168.1.208:80/live'
liveID = '100002750'  #来自于万视无忧中创建的直播
urlKey = 'a1e5c680f7bfc85851de8ab2e63b0a33'  #来自于万视无忧安全设置模块
liveResCode = '71ac6c06d3'  #直播源码


#生成MD5值
def getMD5_Value(inputdata):
  try:
    import hashlib
    hash = hashlib.md5(inputdata.encode('utf-8'))
  except ImportError:
    #for python << 2.5
    import md5
    hash = md5.new()

  return hash.hexdigest()


#直播地址组装
def build_live_addr():
  t = time.strftime('%Y%m%d%H%M%S',time.localtime())[2:]
  data = '%s#%s#%s' %(liveID, t, urlKey)
  secret = getMD5_Value(data)
  rtmp_addr = '%s%s?liveID=%s&time=%s&secret=%s' %(RTMP_ADDR, liveResCode, liveID, t, secret)
  http_addr = '%s/%s/playlist.m3u8?liveID=%s&time=%s&secret=%s' %(HTTP_ADDR, liveResCode, liveID, t, secret)
  FULL_ADDR['rtmp'] = rtmp_addr
  FULL_ADDR['http'] = http_addr
  return FULL_ADDR

#获取本机ip地址,用来产生区别于其他机器的数据
def get_local_ip():
  try:
    ip = os.popen("ifconfig | grep 'inet addr' | awk '{print $2}'").read()
    ip = ip[ip.find(':') + 1:ip.find('\n')]
  except Exception,e:
    print e
  return ip


class Video_To_Live(threading.Thread):
  def __init__(self,queue):
    threading.Thread.__init__(self)
    self.queue = queue

  def run(self):
    liveAddr = self.queue.get()
    #print liveAddr
    try:
      print liveAddr
      subprocess.call('./ffmpeg -i \"%s\" -c:v copy -c:a copy -bsf:a aac_adtstoasc -y -f flv -timeout 4000 /dev/null 2>/dev/null' %liveAddr,stdout=subprocess.PIPE,shell=True)
    except Exception as e:
      wiriteLog('ERROR',str(e))
    self.queue.task_done()


if __name__ == "__main__":
  time.sleep(SLEEP_TIME)
  parser = argparse.ArgumentParser(description = "Live Play")
  parser.add_argument('--liveType',action = "store",dest = "liveType",required = False)
  parser.add_argument('--pnum',action = "store",dest = "pnum",type = int,required = False)
  parser.add_argument('--itime',action = "store",dest = "itime",required = False)
  given_args = parser.parse_args()

  liveType = given_args.liveType 
  threadNum = given_args.pnum
  intervalTime = given_args.itime

  print "%d 个 %s 进程开始运行........" %(threadNum, Video_To_Live)
  for i in xrange(threadNum):
    videotolive = Video_To_Live(queue)
    videotolive.setDaemon(True)
    videotolive.start()

  for i in xrange(threadNum):
    if liveType in ["http","rtmp"]:
        addr = build_live_addr()
      liveaddr = addr[liveType]
    queue.put(liveaddr)
    time.sleep(intervalTime)
  queue.join()
  print "进程退出"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
Django验证码的生成与使用示例
May 20 Python
Python中表示字符串的三种方法
Sep 06 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
python画折线图的程序
Jul 26 Python
Python 获取 datax 执行结果保存到数据库的方法
Jul 11 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
python标准库os库的函数介绍
Feb 12 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
小白如何入门Python? 制作一个网站为例
Mar 06 #Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 #Python
Python从零开始创建区块链
Mar 06 #Python
Django 实现下载文件功能的示例
Mar 06 #Python
python入门前的第一课 python怎样入门
Mar 06 #Python
详解Python判定IP地址合法性的三种方法
Mar 06 #Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 #Python
You might like
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
js验证表单第二部分
2006/11/25 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
Python守护进程和脚本单例运行详解
2017/01/06 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
numpy.where() 用法详解
2019/05/27 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
python eventlet绿化和patch原理
2020/11/21 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
《桃花心木》教学反思
2014/02/17 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
服装店员工管理制度
2015/08/07 职场文书
班主任工作总结范文
2015/08/13 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
详解Vue slot插槽
2021/11/20 Vue.js
hive数据仓库新增字段方法
2022/06/25 数据库