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中as用法实例分析
Apr 30 Python
python黑魔法之参数传递
Feb 12 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
Python 正则表达式爬虫使用案例解析
Sep 23 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
pandas中ix的使用详细讲解
Mar 09 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
如何在Windows中安装多个python解释器
Jun 16 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
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
PHP中Session的概念
2006/10/09 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
php实现学生管理系统
2020/03/21 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue filters的使用详解
2018/06/11 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python算法之栈(stack)的实现
2014/08/18 Python
详解Python中DOM方法的动态性
2015/04/11 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python批量修改图片大小的方法
2018/07/24 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
植树节活动总结
2014/04/30 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
python迷宫问题深度优先遍历实例
2021/06/20 Python