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发布模块的步骤分享
Feb 21 Python
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
numpy.linspace函数具体使用详解
May 27 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
python SVM 线性分类模型的实现
Jul 19 Python
Python实现随机取一个矩阵数组的某几行
Nov 26 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python3判断IP地址的方法
Mar 04 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
Zerg建筑一览
2020/03/14 星际争霸
浅析SVN常见问题及解决方法
2013/06/21 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python实现类之间的方法互相调用
2018/04/29 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
优秀员工评语
2014/02/10 职场文书
单位授权委托书范文
2014/08/02 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python