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使用bs4获取58同城城市分类的方法
Jul 08 Python
Python向日志输出中添加上下文信息
May 24 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
python实现Zabbix-API监控
Sep 17 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python使用递归的方式建立二叉树
Jul 03 Python
python scatter函数用法实例详解
Feb 11 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
python中count函数知识点浅析
Dec 17 Python
pycharm debug 断点调试心得分享
Apr 16 Python
基于python实现银行管理系统
Apr 20 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中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
php swoft框架实例用法
2020/12/22 PHP
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
几个Linux面试题笔试题
2012/12/01 面试题
《蓝色的树叶》教学反思
2014/02/24 职场文书
大学生个人总结范文
2015/02/15 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书