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的Tornado框架中session支持的实现代码
Aug 21 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
Django处理Ajax发送的Get请求代码详解
Jul 29 Python
Python实现Singleton模式的方式详解
Aug 08 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python3实现飞机大战
Nov 29 Python
Python中的datetime包与time包包和模块详情
Feb 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
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php实现上传图片文件代码
2015/07/19 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
Python正则表达式使用经典实例
2016/06/21 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
用python计算文件的MD5值
2020/12/23 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
UNIX文件类型
2013/08/29 面试题
销售自我评价
2013/10/22 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
英文商务邀请信
2014/01/22 职场文书
社团活动总结
2014/04/28 职场文书
中国合伙人观后感
2015/06/02 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
java泛型通配符详解
2021/07/25 Java/Android
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS