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小技巧之批量抓取美女图片
Jun 06 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
Python星号*与**用法分析
Feb 02 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
python多进程控制学习小结
Oct 31 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
python scp 批量同步文件的实现方法
Jan 03 Python
python实现AES加密和解密
Mar 27 Python
Python对象转换为json的方法步骤
Apr 25 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 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
星际争霸秘籍
2020/03/04 星际争霸
php定时执行任务设置详解
2015/02/06 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
完善的jquery处理机制
2016/02/21 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
python批量生成本地ip地址的方法
2015/03/23 Python
python去除所有html标签的方法
2015/05/05 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
python之语音识别speech模块
2020/09/09 Python
python 5个实用的技巧
2020/09/27 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
韩国商务邀请函
2014/01/14 职场文书
铁路安全事故反思
2014/04/26 职场文书
工资收入证明
2014/10/07 职场文书
公司离职证明范本
2014/10/17 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
关于五一放假的通知
2015/08/18 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS