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简单程序读取串口信息的方法
Mar 13 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
详解python eval函数的妙用
Nov 16 Python
一篇文章快速了解Python的GIL
Jan 12 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
python3多线程知识点总结
Sep 26 Python
keras 如何保存最佳的训练模型
May 25 Python
如何利用python生成MD5并去重
Dec 07 Python
pytorch显存一直变大的解决方案
Apr 08 Python
python绘制箱型图
Apr 27 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
python使用glob检索文件的操作
May 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中文转拼音的实现代码
2014/02/11 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
js单例模式详解实例
2013/11/21 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
整理Python 常用string函数(收藏)
2016/05/30 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
如何通过命令行进入python
2020/07/06 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
新闻专业个人求职信
2013/12/19 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
Python中requests做接口测试的方法
2021/05/30 Python
react 路由Link配置详解
2021/11/11 Javascript
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL