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使用calendar输出指定年份全年日历的方法
Apr 04 Python
python使用pymysql实现操作mysql
Sep 13 Python
python实现定时提取实时日志程序
Jun 22 Python
python实现简单http服务器功能
Sep 17 Python
python实现字符串和字典的转换
Sep 29 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
keras 如何保存最佳的训练模型
May 25 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
如何在python中实现ECDSA你知道吗
Nov 23 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
Smarty模板快速入门
2007/01/04 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python表达式的优先级详解
2020/02/18 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
python Scrapy框架原理解析
2021/01/04 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
年级组长自我鉴定
2014/02/22 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
公司费用报销管理制度
2015/08/04 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
高质量“欢迎词”
2019/04/03 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
DE1103使用报告
2022/04/05 无线电