Commit 49a92319 authored by liyuanhong's avatar liyuanhong

增加了帧的预览

parent 11e5b4c7
...@@ -24,6 +24,7 @@ class StreamH264Flv(): ...@@ -24,6 +24,7 @@ class StreamH264Flv():
self.channel = 1 # 频道号 self.channel = 1 # 频道号
self.isSendAudio = 1 # 是否发送音频0:不发送 1:发送 self.isSendAudio = 1 # 是否发送音频0:不发送 1:发送
self.isSend = 0 # 是否发送消息 0:不发送 1:发送 self.isSend = 0 # 是否发送消息 0:不发送 1:发送
self.isEndPush = 0 # 是否结束推流 0:不结束 1:结束
# self.host = "10.100.11.125" # 开发环境 # self.host = "10.100.11.125" # 开发环境
self.host = "10.100.12.3" # 测试环境 self.host = "10.100.12.3" # 测试环境
...@@ -51,6 +52,10 @@ class StreamH264Flv(): ...@@ -51,6 +52,10 @@ class StreamH264Flv():
self.sendDur = data self.sendDur = data
def setVideoPath(self,data): def setVideoPath(self,data):
self.videoPath = data self.videoPath = data
def setIsSend(self,data):
self.isSend = data
def setIsEndPush(self,data):
self.isEndPush = data
#################################################### ####################################################
...@@ -75,7 +80,8 @@ class StreamH264Flv(): ...@@ -75,7 +80,8 @@ class StreamH264Flv():
# 读取flv文件,并发送 (h264编码,并且音频为aac编码格式) # 读取flv文件,并发送 (h264编码,并且音频为aac编码格式)
#################################################### ####################################################
def readFlvAndSend(self): def readFlvAndSend(self):
self.isSend = 1 self.isSend = 1 # 控制暂停或继续推流
self.isEndPush = 0
with open(self.videoPath, 'rb') as fi: with open(self.videoPath, 'rb') as fi:
con = fi.read(self.readSize) con = fi.read(self.readSize)
data = con.hex() data = con.hex()
...@@ -85,42 +91,45 @@ class StreamH264Flv(): ...@@ -85,42 +91,45 @@ class StreamH264Flv():
else: else:
data = data data = data
while con: while con:
if self.isSend == 1: if self.isEndPush != 0:
if len(data) < 30: break
con = fi.read(self.readSize) else:
data = data + con.hex() if self.isSend == 1:
else: if len(data) < 30:
tagSize = self.getAVTagSize(data)
if len(data) < (tagSize * 2 + 30):
con = fi.read(self.readSize) con = fi.read(self.readSize)
data = data + con.hex() data = data + con.hex()
else: else:
tag = data[:tagSize * 2 + 30] # flv tag tagSize = self.getAVTagSize(data)
tagType = self.getTagType(tag) # flv tag 类型,是音频 还是视频 if len(data) < (tagSize * 2 + 30):
AVtag = tag[30:] # 音视频 tag con = fi.read(self.readSize)
avTimeStamp = self.getAVTimeStamp(tag) #获取时间戳 data = data + con.hex()
if avTimeStamp > 100:
if self.isGetPlayUrl == 0:
self.getPlayUrl(self.mobile,self.channel)
self.isGetPlayUrl = 1
if tagType == "08": # 音频
AVdata = AVtag[4:] # 音频数据
if self.isSendAudio == 1:
frameInfo = self.getAudioFrame(AVtag)
for frame in frameInfo["frames"]:
self.sendAudioFrame(frame,avTimeStamp)
elif tagType == "09": # 视频
AVdata = AVtag[10:] # 视频数据
frameInfo = self.getVideoFrame(AVtag)
for frame in frameInfo["frames"]:
self.sendVideoFrame(frame,avTimeStamp)
elif tagType == "12": # 脚本
AVdata = AVtag # 脚本数据
else: else:
AVdata = AVtag tag = data[:tagSize * 2 + 30] # flv tag
data = data[(tagSize * 2 + 30):] tagType = self.getTagType(tag) # flv tag 类型,是音频 还是视频
else: AVtag = tag[30:] # 音视频 tag
time.sleep(1) avTimeStamp = self.getAVTimeStamp(tag) #获取时间戳
if avTimeStamp > 100:
if self.isGetPlayUrl == 0:
self.getPlayUrl(self.mobile,self.channel)
self.isGetPlayUrl = 1
if tagType == "08": # 音频
AVdata = AVtag[4:] # 音频数据
if self.isSendAudio == 1:
frameInfo = self.getAudioFrame(AVtag)
for frame in frameInfo["frames"]:
self.sendAudioFrame(frame,avTimeStamp)
elif tagType == "09": # 视频
AVdata = AVtag[10:] # 视频数据
frameInfo = self.getVideoFrame(AVtag)
for frame in frameInfo["frames"]:
self.sendVideoFrame(frame,avTimeStamp)
elif tagType == "12": # 脚本
AVdata = AVtag # 脚本数据
else:
AVdata = AVtag
data = data[(tagSize * 2 + 30):]
else:
time.sleep(1)
self.client.close() self.client.close()
#################################################### ####################################################
......
...@@ -5,6 +5,8 @@ import sys ...@@ -5,6 +5,8 @@ import sys
import threading import threading
import time import time
import traceback import traceback
import platform
import cv2
import requests import requests
import wx import wx
...@@ -35,7 +37,8 @@ class CameraArea(): ...@@ -35,7 +37,8 @@ class CameraArea():
self.logTextCtr = None # 日志显示区域 self.logTextCtr = None # 日志显示区域
self.msgSendDurText = None # 发送间隔文本框 self.msgSendDurText = None # 发送间隔文本框
self.audioCombox = None # 音频开关按钮 self.audioCombox = None # 音频开关按钮
self.videoPlayText = None # 获取播放地址文本框 self.videoPlayText = None # 获取播放地址文本框
self.isShowFrame = 0 # 是否展示帧预览画面 0:不显示 1:显示
def setDevId(self,data): def setDevId(self,data):
self.devId = data self.devId = data
...@@ -70,7 +73,7 @@ class CameraArea(): ...@@ -70,7 +73,7 @@ class CameraArea():
paramView = wx.Panel(topPanel) paramView = wx.Panel(topPanel)
wx.StaticText(paramView, label='本地视频:', pos=(10, 10)) wx.StaticText(paramView, label='本地视频:', pos=(10, 10))
fiPath = os.getcwd() + "\\flv\\aaa3.flv" fiPath = os.getcwd() + "/flv/aaa3.flv"
self.videoPathText = wx.TextCtrl(paramView, pos=(70, 5), size=wx.Size(300, -1),value=fiPath) # 要推流的视频地址 self.videoPathText = wx.TextCtrl(paramView, pos=(70, 5), size=wx.Size(300, -1),value=fiPath) # 要推流的视频地址
selectPathButton = wx.Button(paramView, label="选择视频文件", pos=(375, 5)) selectPathButton = wx.Button(paramView, label="选择视频文件", pos=(375, 5))
self.frame.Bind(wx.EVT_BUTTON, lambda evt, textCtr=self.videoPathText: self.selectVideoFile(evt, textCtr), self.frame.Bind(wx.EVT_BUTTON, lambda evt, textCtr=self.videoPathText: self.selectVideoFile(evt, textCtr),
...@@ -93,9 +96,9 @@ class CameraArea(): ...@@ -93,9 +96,9 @@ class CameraArea():
self.audioCombox = wx.ComboBox(paramView, pos=(240,125), choices=['开', '关'],value="开",size=wx.Size(50,-1)) self.audioCombox = wx.ComboBox(paramView, pos=(240,125), choices=['开', '关'],value="开",size=wx.Size(50,-1))
wx.StaticText(paramView, label='播放地址:', pos=(10, 190)) wx.StaticText(paramView, label='播放地址:', pos=(10, 190))
self.videoPlayText = wx.TextCtrl(paramView, pos=(70, 185), size=wx.Size(350, -1)) # 视频播放地址 self.videoPlayText = wx.TextCtrl(paramView, pos=(70, 185), size=wx.Size(350, -1)) # 视频播放地址
self.getPlayUrlButton = wx.Button(paramView, label="获取播放地址", pos=(425, 185)) getPlayUrlButton = wx.Button(paramView, label="获取播放地址", pos=(425, 185))
self.frame.Bind(wx.EVT_BUTTON, lambda evt, textCtr=self.videoPlayText: self.getPlayUrl(evt, textCtr), self.frame.Bind(wx.EVT_BUTTON, lambda evt, textCtr=self.videoPlayText: self.getPlayUrl(evt, textCtr),
self.getPlayUrlButton) getPlayUrlButton)
ctrView = wx.Panel(topPanel, style=wx.BORDER_SIMPLE) ctrView = wx.Panel(topPanel, style=wx.BORDER_SIMPLE)
connectButton = wx.Button(ctrView, label="1、连网", pos=(5, 5)) connectButton = wx.Button(ctrView, label="1、连网", pos=(5, 5))
...@@ -106,14 +109,20 @@ class CameraArea(): ...@@ -106,14 +109,20 @@ class CameraArea():
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.startPush(evt), self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.startPush(evt),
startPushButton) startPushButton)
pausePushButton = wx.Button(ctrView, label="3、停止推流", pos=(5, 35)) pausePushButton = wx.Button(ctrView, label="3、停止推流", pos=(5, 35))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.pausePush(evt),pausePushButton)
rePushButton = wx.Button(ctrView, label="4、继续推流", pos=(120, 35)) rePushButton = wx.Button(ctrView, label="4、继续推流", pos=(120, 35))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.continuePush(evt), rePushButton)
stopPushButton = wx.Button(ctrView, label="5、结束推流", pos=(5, 65)) stopPushButton = wx.Button(ctrView, label="5、结束推流", pos=(5, 65))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.stopPush(evt), stopPushButton)
disConnectButton = wx.Button(ctrView, label="6、断网", pos=(120, 65)) disConnectButton = wx.Button(ctrView, label="6、断网", pos=(120, 65))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.disConnect(evt), self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.disConnect(evt),
disConnectButton) disConnectButton)
playStreamVideoButton = wx.Button(ctrView, label="播放流地址", pos=(5, 95)) playStreamVideoButton = wx.Button(ctrView, label="播放流地址", pos=(5, 95))
showFrameButton = wx.Button(ctrView, label="实时显示帧画面", pos=(120, 95)) showFrameButton = wx.Button(ctrView, label="实时显示帧画面", pos=(120, 95))
# ctrView.SetBackgroundColour("PINK") self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.showFrame(evt), showFrameButton)
StopPlayStreamVideoButton = wx.Button(ctrView, label="停止播放", pos=(5, 125))
stopShowFrameButton = wx.Button(ctrView, label="停止显示帧画面", pos=(120, 125))
self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.stopShowFrame(evt), stopShowFrameButton)
boxSizer_1 = wx.BoxSizer(wx.HORIZONTAL) boxSizer_1 = wx.BoxSizer(wx.HORIZONTAL)
boxSizer_1.Add(preView, 1, flag=wx.EXPAND | wx.ALL) boxSizer_1.Add(preView, 1, flag=wx.EXPAND | wx.ALL)
...@@ -187,8 +196,7 @@ class CameraArea(): ...@@ -187,8 +196,7 @@ class CameraArea():
def getPlayUrl(self,evt,textCtr): def getPlayUrl(self,evt,textCtr):
sys.stdout = self.logTextCtr sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.doGetPlayUrl, threadObj = threading.Thread(target=self.doGetPlayUrl,args=(textCtr,))
args=(textCtr,))
threadObj.start() threadObj.start()
#################################################### ####################################################
...@@ -269,11 +277,14 @@ class CameraArea(): ...@@ -269,11 +277,14 @@ class CameraArea():
sys.stdout = self.logTextCtr sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr sys.stderr = self.logTextCtr
try: try:
threadObj = threading.Thread(target=self.pushStream)
threadObj.start()
timeCur = self.getCurTime() timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "推流成功!\n") if self.pushObj != None:
self.pushStatusText.SetValue("推流中") threadObj = threading.Thread(target=self.pushStream)
threadObj.start()
self.logTextCtr.WriteText(timeCur + "推流成功!\n")
self.pushStatusText.SetValue("推流中")
else:
self.logTextCtr.WriteText(timeCur + "未连网!\n")
except: except:
traceback.print_exc() traceback.print_exc()
def pushStream(self): def pushStream(self):
...@@ -284,6 +295,55 @@ class CameraArea(): ...@@ -284,6 +295,55 @@ class CameraArea():
except: except:
traceback.print_exc() traceback.print_exc()
####################################################
# 暂停推流
####################################################
def pausePush(self,evt):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.doPausePush())
threadObj.start()
def doPausePush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "暂停推流!\n")
self.pushStatusText.SetValue("推流暂停")
self.pushObj.setIsSend(0)
####################################################
# 继续推流
####################################################
def continuePush(self,evt):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.doContinuePush())
threadObj.start()
def doContinuePush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "继续推流!\n")
self.pushStatusText.SetValue("推流中")
self.pushObj.setIsSend(1)
####################################################
# 停止推流
####################################################
def stopPush(self,evt):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.doStopPush())
threadObj.start()
def doStopPush(self):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "推流停止!\n")
self.pushStatusText.SetValue("连网")
self.pushObj.setIsEndPush(1)
self.pushObj = None
#################################################### ####################################################
# 清空日志 # 清空日志
...@@ -291,3 +351,62 @@ class CameraArea(): ...@@ -291,3 +351,62 @@ class CameraArea():
def clearLog(self,evt): def clearLog(self,evt):
self.logTextCtr.SetValue("") self.logTextCtr.SetValue("")
####################################################
# 获取操作系统名字
####################################################
def getOsName(self):
osName = platform.system()
return osName
####################################################
# 实时显示帧画面
####################################################
def showFrame(self,evt):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.doShowFrame())
threadObj.start()
def doShowFrame(self):
self.isShowFrame = 1
devId = self.devIdText.GetValue()
channel = self.channelText.GetValue()
res = requests.post(self.getGetPlayUrl, data=json.dumps({'devId': devId, 'chan': str(channel)})).text
res = json.loads(res)
pullUrl = res["data"]["url"]
cap = cv2.VideoCapture(pullUrl)
try:
timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "帧预览开始!\n")
while (cap.isOpened()):
if self.isShowFrame == 1:
ret, frame = cap.read()
if ret == False:
break
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
timeCur = self.getCurTime()
self.logTextCtr.WriteText(timeCur + "帧预览停止!\n")
break
cap.release()
cv2.destroyAllWindows()
except:
traceback.print_exc()
####################################################
# 停止显示帧画面
####################################################
def stopShowFrame(self,evt):
sys.stdout = self.logTextCtr
sys.stderr = self.logTextCtr
threadObj = threading.Thread(target=self.stopDoShowFrame())
threadObj.start()
def stopDoShowFrame(self):
self.isShowFrame = 0
####################################################
# 播放视频地址
###################################################
def playFrame(self):
pass
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment