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中操作字符串之replace()方法的使用
May 19 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python多进程同步简单实现代码
Apr 27 Python
如何将python中的List转化成dictionary
Aug 15 Python
python中模块的__all__属性详解
Oct 26 Python
python tkinter界面居中显示的方法
Oct 11 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
python中time库的实例使用方法
Oct 31 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
pycharm 实现调试窗口恢复
Feb 05 Python
python数字图像处理:图像简单滤波
Jun 28 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
纯JS实现轮播图
2017/02/22 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
简单了解python列表和元组的区别
2020/05/14 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
初中班长竞选稿
2015/11/20 职场文书
资产移交协议书
2016/03/24 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL