利用python3.5 构建流媒体后台音视频切换的服务端程序
#!/usr/bin/env python3.5.0
# -*- coding:utf8 -*-
import os,sys,socket,hashlib,time,select,threading,configparser
import pymssql
rootdir =os.path.abspath(sys.argv[0])
rootdir =os.path.dirname(rootdir) +"/"
cf =configparser.ConfigParser()
if os.path.exists(rootdir +'srs_server.conf'):
cf.read(rootdir +'srs_server.conf')
else:
# 如果文件不存在
f = open(rootdir + "/srs_server.conf","w")
f.write("")
f.close()
# 读取配置文件
cf.read(rootdir +'srs_server.conf')
cf.add_section("srs")
cf.set("srs","config","")
# 写回配置文件
cf.write(open(rootdir +'srs_server.conf',"w"))
def decrypt(s,key=2):
"""
解密方法
:param key:
:param s:
:return:
"""
c = bytearray(str(s).encode("gbk"))
n = len(c) # 计算 b 的字节数
if n % 2 != 0 :
return ""
n = n // 2
b = bytearray(n)
j = 0
for i in range(0, n):
c1 = c[j]
c2 = c[j+1]
j = j+2
c1 = c1 - 65
c2 = c2 - 65
b2 = c2*16 + c1
b1 = b2^ key
b[i]= b1
try:
return b.decode("gbk")
except:
return "failed"
# 实例化数据库类
class MSSQL:
def __init__(self,host,user,pwd,db,port =1433):
self.host = host
self.port = port
self.user = user
self.pwd = pwd
self.db = db
def __GetConnect(self):
try:
if not self.db:
print("没有设置数据库信息")
self.conn = pymssql.connect(host=self.host,port=self.port,user=self.user,password=self.pwd,database=self.db,charset="utf8")
cur = self.conn.cursor()
if not cur:
print("连接数据库失败!")
else:
return cur
except Exception as e:
print("连接数据库失败,%s"%e)
def ExecQuery(self,sql):
cur = self.__GetConnect()
cur.execute(sql)
resList = cur.fetchall()
# 查询完毕后必须关闭连接
self.conn.close()
return resList def ExecNonQuery(self,sql):
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
# 查询数据库相关信息情况
# 更新SQL数据库相关信息情况
def updatesql(load=0,status=0,item=0):
# 加载配置文件
cf = configparser.ConfigParser()
if os.path.exists(rootdir+"srs_server.conf"):
try:
cf.read(rootdir+"srs_server.conf")
except Exception as c:
print(c)
else:
print("加载srs_server.conf配置文件失败!")
# 实例化MSSQL操作类
host = cf.get("HOST","host")
ms = MSSQL(host=cf.get("DB","ip"),user=decrypt(cf.get("DB","username")),pwd=decrypt(cf.get("DB","password")),db=cf.get("DB","db"),port=int(cf.get("DB","port")))
try:
# 更新该服务器所有记录
sql = "update sys_load set item = '%s',sysload='%s',status='%s' where servername ='%s'"%(item, load, status, host)
ms.ExecNonQuery(sql)
except:
pass def selectdata(conn):
conf = cf.get("srs","config")
if conf == "":
conn.send(bytes("当前为音频模式!","utf-8"))
elif conf == "":
conn.send(bytes("当前为视频模式!","utf-8"))
def updatesound(conn):
with open(rootdir +'srs.conf',"r") as f:
data = f.readlines()
for i,line in enumerate(data):
# 去除制表符,换行符
line = line.replace('\t','').replace('\n','').replace(' ','')
if line =="#allowpublish220.168.91.254;":
data[i] ="\tallow\t\tpublish\t\t220.168.91.254;\t\n"
elif line == "#forward10.27.68.150;":
data[i] = "\tforward\t\t10.27.68.150;\t\t \n"
elif line == "transcodelive/livestream{":
f.seek(i+1)
data[i+1] = "\tenabled\t\ton;\n"
with open(rootdir +'srs.conf',"w") as xf:
xf.writelines(data)
xf.close()
status = os.system("service srs restart")
if status == 0:
cf.read(rootdir +'srs_server.conf')
cf.set("srs","config","")
cf.write(open(rootdir +'srs_server.conf',"w"))
updatesql(item=0,load=1,status=0)
conn.send(bytes("当前已成功切换为音频模式","utf-8"))
else:
conn.send(bytes("切换为音频模式失败,请联系IT部!","utf-8"))
def updatevideo(conn):
with open(rootdir +'srs.conf',"r") as f:
data = f.readlines()
for i,line in enumerate(data):
# 去除制表符,换行符
line = line.replace('\t','').replace('\n','').replace(' ','')
if line =="allowpublish220.168.91.254;":
data[i] ="\t#allow\t\tpublish\t\t220.168.91.254;\t\n"
elif line == "forward10.27.68.150;":
data[i] = "\t#forward\t10.27.68.150;\n"
elif line == "transcodelive/livestream{":
# 下一行
f.seek(i+1)
data[i+1] = "\tenabled\t\toff;\n"
with open(rootdir +'srs.conf',"w") as xf:
xf.writelines(data)
xf.close()
status = os.system("service srs restart")
if status == 0:
cf.read(rootdir +'srs_server.conf')
cf.set("srs","config","")
cf.write(open(rootdir +'srs_server.conf',"w"))
updatesql(item=1,load=3,status=1)
conn.send(bytes("当前已成功切换为视频模式","utf-8"))
else:
conn.send(bytes("切换视频模式失败,请联系IT部!","utf-8"))
def crash_recovery(conn):
os.system("service srs stop")
# 强制还原配置文件
os.system("yes|cp -fr srs_bak.conf srs.conf")
status = os.system("service srs start")
if status == 0:
cf.read(rootdir +'srs_server.conf')
cf.set("srs","config","")
cf.write(open(rootdir +'srs_server.conf',"w"))
updatesql(item=0,load=1,status=0)
conn.send(bytes("修复音频模式成功","utf-8"))
else:
conn.send(bytes("修复音频模式失败,请与IT部联系!","utf-8"))
# 业务执行函数
def operation(conn):
content = """
请输入数字选项进行操作:
1、查询当前直播频道
2、切换频道为音频直播
3、切换频道为视频直播
4、故障修复(默认修复为音频模式)
***********************
"""
conn.send(bytes(content,"utf-8"))
while True:
# 接收数据
data = conn.recv(1000)
test =data.decode()
if int(test) == 1:
selectdata(conn)
elif int(test) ==2:
updatesound(conn)
elif int(test) ==3:
updatevideo(conn)
elif int(test) ==4:
crash_recovery(conn)
# SOCKET主进程模块
def process(conn,addr):
try:
i = 0
# 认证失败允许重试3次
while i < 3:
flage = False
# 接收客户端连接请求信息
info = conn.recv(1000)
# 实例化加密函数
hash = hashlib.sha512()
hash.update("a123456789B".encode("utf-8")) # KEY=a123456789B
hash_pwd = hash.hexdigest()
if info.decode() == hash_pwd:
hash_pwd = ""
info = ""
if addr[0] in ["192.168.1.252","192.168.1.190","127.0.0.1"]:
flage = True
# 接收用户及密码信息
while flage:
operation(conn)
else:
# 登陆失败,发送给客户端重新验证
i += 1
conn.send(bytes("error","utf8"))
if i > 2:
# 主动关闭连接
conn.close()
time.sleep(25)
except Exception as e:
conn.close()
time.sleep(15)
# SOCKET服务模块
def sock_server():
'''
启动服务器端,开启线程监听
:return:
'''
server = socket.socket()
server_ip ="localhost"
server_port = 1888
server.bind((server_ip,server_port))
server.listen(10)
while True:
r,w,e = select.select([server,], [], [], 1)
for i,server in enumerate(r):
time.sleep(1)
conn,addr = server.accept()
# 创建线程
t = threading.Thread(target=process, args=(conn, addr))
# 启动线程
t.start()
if __name__ =="__main__":
sock_server()
利用python3.5 构建流媒体后台音视频切换的服务端程序的更多相关文章
- vlc源码分析(五) 流媒体的音视频同步
vlc播放流媒体时实现音视频同步,简单来说就是发送方发送的RTP包带有时间戳,接收方根据此时间戳不断校正本地时钟,播放音视频时根据本地时钟进行同步播放.首先了解两个概念:stream clock和sy ...
- 腾讯互动白板+即时通讯+实时音视频,Android学生端接入
腾讯互动白板+即时通讯+实时音视频,Android学生端接入 一.简介 线上教学方案:腾讯云互动白板(Tencent Interactive Whiteboard,TIW)+即时通信(Instant ...
- 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客 ...
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...
- 音视频】5.ffmpeg命令分类与使用
GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
- 2┃音视频直播系统之浏览器中通过 WebRTC 拍照片加滤镜并保存
一.拍照原理 好多人小时候应该都学过,在几张空白的纸上画同一个物体,并让物体之间稍有一些变化,然后连续快速地翻动这几张纸,它就形成了一个小动画,音视频播放器就是利用这样的原理来播放音视频文件的 播放器 ...
- Android IOS WebRTC 音视频开发总结(三九)-- win10升级为何要p2p
本文主要介绍webrtc p2p的应用场景,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. P2P最简单的解释就是两个客户端之间直接进行数据交互,不经过服务端转发. 最早接触P2P是 ...
- Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)
一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端, ...
随机推荐
- MVC与Validate验证提示的样式修改
MVC中使用Validate的验证,要修改错误提示样式一共有3处需要修改,否则就不太完美了: MVC中的Validate的验证机制只用在后台写一次,就可以完成前台和后台的完美验证,前台的验证主要是依靠 ...
- MVC 5 - 将数据从控制器传递给视图
MVC 5 - 将数据从控制器传递给视图 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据 ...
- c++类的构造函数与析构函数
为什么用构造函数与析构函数 构造函数: c++目标是让使用类对象就像使用标准类型一样,但是常规化的初始化句法不适用与类类型. ; //基本类型 struct thing { char *pn; int ...
- D8
=-=昨天被老师拉去吃点心了就没有发题解...忧伤..昨天的T2貌似都没有调完嗯 今天脑洞是大啊.. T1模拟写挂..呵呵我一面 T2数学题..刚开始只会求素数表的那种方法暴力..不过后面他们都知道一 ...
- iframe跨域通讯
工作中遇到一个问题,IFRAME嵌套了一个外部页面用于统计 统计的JS由我们提供,并且需要提供热点图 一开始就碰到的问题就是 不知道页面高度 需要子页面传回页面高度用于将IFRAME拉升到合适高度 当 ...
- asp.net的ajax以及json
asp.net的ajax以及json 来现在这家公司以前,从未接触过webform,以前在学校做的项目是php,java以及asp.net mvc的,当时asp.net mvc用的是razor引擎,所 ...
- Scut游戏服务器免费开源框架-3
Scut游戏服务器免费开源框架--快速开发(3) Scut快速开发(3) 1 开发环境 需要安装的软件 a) 消息队列 b) 数据库,Sql2005以上版本 ...
- 软件快速开发平台 WebBuilder 6.8
WebBuilder是一款开源的跨平台.数据库和浏览器的可视化Web应用快速开发平台.WebBuilder使用了多项最新的技术,使Web应用的开发更快捷和简单. 作为一款高效的Web开发工具,WebB ...
- 给Amazon ec2 增加卷(Volume)并挂载到系统
给Amazon ec2 增加卷(Volume)并挂载到系统 前言 导师让师弟把实验的网站挂到亚马逊的EC2云服务器上.师弟对linux不太熟悉.就跑过来问我.于是花了一个小时搞定.问题主要是将EC2的 ...
- 从零开始学C++之STL(四):算法简介、7种算法分类
一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...