Commit c6a518d5 authored by liyuanhong's avatar liyuanhong

完成了flv视频的推流

parent 26f7f1d0
File added
#coding:utf-8
class Protocal_1078:
def __init__(self):
self.frameHeader1078 = "30316364" # JT/T 1078 头 固定为0x30 0x31 0x63 0x64,ASCII码为01cd
self.V = 2 << 6 # V 固定为2
self.P = 0 << 5 # P 固定为0
self.X = 0 << 4 # X RTP头是否需要扩展位,固定为0
self.CC = 1 # CC 固定为1
self.M = 1 << 7 # M 标志位,确定是否完整数据帧的边界,因为数据体的最大长度是950字节,而一个视频I帧通道要远远超过950字节,所以视频的一个帧通常会分包
self.PT = 98 # PT 98:表示H264 99:表示H265
self.sn = 0 # 包序号 初始为0,每发送一个RTP数据包,序列号加1
self.sim = "013146201117" # 终端设备SIM卡号
self.logicC = 1 # 逻辑通道
self.dataType = 0 << 4 # 数据类型 , 0000:数据I祯,0001:视频P帧,0010:视频B帧,0011:音频帧,0100:透传数据
self.pkgTag = 1 # 分包处理 ,0000:原子包,不可拆分等,0001:分包处理时的第一个包,0010:分包处理时的最后一个包,0011:分包处理时的中间包
self.time = 33 # 时间戳
self.lastKeyTime = 33 # Last I Frame Interval 该祯与上一个关键祯之间的时间间隔,单位毫秒(ms),当数据类型为非视频祯时,则没有该字段
self.lastTime = 33 # Last Frame Interval 该祯与上一个祯之间的时间时间,单位毫秒(ms),当数据类型为非视频祯时,则没有该字段
self.lenS = 950 # 数据长度
self.dataBody = "" # 数据体,要发送的帧数据
# self.host = "10.100.11.125"
self.host = "10.16.15.85"
self.port = 1078
self.BUF_SIZE = 2048
def setDataBody(self,data):
self.dataBody = data
def setM(self,data):
self.M = data << 7
def setSim(self,data):
while len(data) < 12:
data = "0" + data
self.sim = data
def setSn(self,data):
self.sn = data
def setTime(self,data):
self.time = data
def setLastKeyTime(self,data):
self.lastKeyTime = data
def setLastTime(self,data):
self.lastTime = data
#####################################################
# 从帧数据中获取帧类型
#####################################################
def getFrameType(self):
# 0x67 (0 11 00111) SPS 非常重要 type = 7
# 0x68 (0 11 01000) PPS 非常重要 type = 8
# 0x65 (0 11 00101) IDR帧 关键帧 非常重要 type = 5
# 0x61 (0 11 00001) I帧 重要 type=1 非IDR的I帧 不大常见
# 0x41 (0 10 00001) P帧 重要 type = 1
# 0x01 (0 00 00001) B帧 不重要 type = 1
# 0x06 (0 00 00110) SEI 不重要 type = 6
frameTypeHex = self.dataBody[8:10]
return frameTypeHex
#####################################################
# 数字转换为16进制字符串,通过传入字节数可自动补0
# 传入数据格式所占字节数
#####################################################
def int2hexStringByBytes(self, num,bytescount=1):
hexStr = hex(num)[2:]
while len(hexStr) < (bytescount * 2):
hexStr = "0" + hexStr
return hexStr
#####################################################
# 根据长度分割字符串
#####################################################
def splitStrByLen(self,strs,num):
result = []
if num > len(strs):
result.append(strs)
else:
result.append(strs[:num])
strs = strs[num:]
while len(strs) > num:
result.append(strs[:num])
strs = strs[num:]
if len(strs) > 0:
result.append(strs)
return result
#####################################################
# 生成单个数据包
#####################################################
def genPkg(self,data):
msg = ""
msg = self.frameHeader1078
msg = msg + self.int2hexStringByBytes(self.V + self.P + self.X + self.CC)
msg = msg + self.int2hexStringByBytes(self.M + self.PT)
msg = msg + self.int2hexStringByBytes(self.sn,2)
msg = msg + self.sim
msg = msg + self.int2hexStringByBytes(self.logicC)
msg = msg + self.int2hexStringByBytes(self.dataType + self.pkgTag)
msg = msg + self.int2hexStringByBytes(self.time,8)
msg = msg + self.int2hexStringByBytes(self.lastKeyTime,2)
msg = msg + self.int2hexStringByBytes(self.lastTime,2)
msg = msg + self.int2hexStringByBytes(int(len(data) / 2),2)
msg = msg + data
return msg
#####################################################
# 生成单个数据包
#####################################################
def genAudioPkg(self,data):
msg = ""
msg = self.frameHeader1078
msg = msg + self.int2hexStringByBytes(self.V + self.P + self.X + self.CC)
self.PT = 19
msg = msg + self.int2hexStringByBytes(self.M + self.PT)
msg = msg + self.int2hexStringByBytes(self.sn,2)
msg = msg + self.sim
msg = msg + self.int2hexStringByBytes(self.logicC)
msg = msg + self.int2hexStringByBytes(self.dataType + self.pkgTag)
msg = msg + self.int2hexStringByBytes(self.time,8)
msg = msg + self.int2hexStringByBytes(int(len(data) / 2),2)
msg = msg + data
return msg
#####################################################
# 根据帧数据,生成多个数据包(视频)
#####################################################
def genPkgsByFrame(self):
f_type = self.getFrameType()
if f_type == "65" or f_type == "61":
self.dataType = 0 << 4 # 0000
elif f_type == "41":
self.dataType = 1 << 4 # 0001
elif f_type == "01":
self.dataType = 2 << 4 # 0010
else:
self.dataType = 2 << 4 # 0010
datas = self.splitStrByLen(self.dataBody,1900)
pkgs = []
for i in range(0,len(datas)):
if len(datas) == 1:
self.pkgTag = 0 # 原子包 0000
else:
if i == 0:
self.pkgTag = 1 # 第一个包 0001
elif i < (len(datas) - 1):
self.pkgTag = 3 # 中间包 0011
else:
self.pkgTag = 2 # 最后一个包 0010
pkg = self.genPkg(datas[i])
pkgs.append(pkg)
if self.sn >= 65535:
self.sn = 0
self.sn = self.sn + 1
return pkgs
#####################################################
# 根据帧数据,生成多个数据包(音频频)
#####################################################
def genAudioPkgsByFrame(self):
self.dataType = 3 << 4
datas = self.splitStrByLen(self.dataBody,1900)
pkgs = []
for i in range(0,len(datas)):
if len(datas) == 1:
self.pkgTag = 0 # 原子包 0000
else:
if i == 0:
self.pkgTag = 1 # 第一个包 0001
elif i < (len(datas) - 1):
self.pkgTag = 3 # 中间包 0011
else:
self.pkgTag = 2 # 最后一个包 0010
pkg = self.genAudioPkg(datas[i])
pkgs.append(pkg)
if self.sn == 65535:
self.sn = 0
self.sn = self.sn + 1
return pkgs
if __name__ == "__main__":
pro = Protocal_1078()
# print(Protocal_1078().genPkg())
# Protocal_1078().readvideoFile()
# pro.getFrameType()
......@@ -2,6 +2,12 @@
import binascii
import socket
import time
import logging
from lib.socket.ClientSocket import ClientSocket
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# http://10.100.11.125:8085/live?port=1985&app=vandyo&stream=013146201117-1
# http://10.16.15.85:8085/live?port=1985&app=vandyo&stream=013146201117-3
......@@ -18,9 +24,9 @@ class StreamH264():
self.mobile = "013146201117" # 手机号
self.channel = 1 # 频道号
# self.host = "10.100.11.125"
self.host = "10.100.11.125"
# self.host = "10.16.12.249"
self.host = "10.100.12.3"
# self.host = "10.100.12.3"
# self.host = "localhost"
self.port = 1078
self.client = None
......@@ -50,6 +56,8 @@ class StreamH264():
self.aacFront_28 = "" # aac 音频前28个固定bit 的值
self.aacIsFront_28 = 0 # aac 是否已经取出了前28个字节
self.frameNum = 0 # 发送的包数量,用于测试
def setSendDur(self,data):
self.sendDur = data
def setAVChangeBySecond(self,data):
......@@ -76,6 +84,7 @@ class StreamH264():
else:
self.time = int(1000 / data)
self.singleFrameTime = int(1000 / data)
self.lastTime = self.singleFrameTime
####################################################
# 设置音频帧率
......@@ -91,9 +100,13 @@ class StreamH264():
# socket 连接
####################################################
def connectServer(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
self.client.connect((self.host, self.port))
socketObj = ClientSocket()
socketObj.setHost(self.host)
socketObj.setPort(self.port)
self.client = socketObj.connect()
# self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
# self.client.connect((self.host, self.port))
####################################################
# 同时发送视频和音频
......@@ -108,6 +121,7 @@ class StreamH264():
data = con.hex() # 16进制字节码转字符串
frames, lastData = self.getFramesFromStr_2(data)
for fra in frames:
self.frameNum = self.frameNum + 1
protocal_1078.setDataBody("00000001" + fra)
frameType = protocal_1078.getFrameType()
self.doFrameCount(frameType, protocal_1078)
......@@ -124,6 +138,7 @@ class StreamH264():
dataAudio = conAudio.hex() # 16进制字节码转字符串
framesAudio, lastDataAudio = self.getAudioFramesFromStr_2(dataAudio)
for fraAudio in framesAudio:
self.frameNum = self.frameNum + 1
protocal_1078.setDataBody(self.aacFront_28 + fraAudio)
self.doAudioFrameCount(protocal_1078)
pkgsAudio = protocal_1078.genAudioPkgsByFrame()
......@@ -138,6 +153,7 @@ class StreamH264():
videoTempFrame = []
isVloop = 0
for fra in frames:
self.frameNum = self.frameNum + 1
if self.videoCount >= int(self.singleFrameTime / self.AVChangeBySecond):
self.sendFrameType = 1
self.videoCount = 0
......@@ -169,6 +185,7 @@ class StreamH264():
if con:
frames, lastData = self.getFramesFromStr_2(data, lastData)
for fra in frames:
self.frameNum = self.frameNum + 1
if self.videoCount >= int(self.singleFrameTime / self.AVChangeBySecond):
self.sendFrameType = 1
self.videoCount = 0
......@@ -194,6 +211,7 @@ class StreamH264():
audioTempFrame = []
isALoop = 0
for fraAudio in framesAudio:
self.frameNum = self.frameNum + 1
if self.audioCount >= int(1000 / (self.singleFrameTimeAudio * 2)):
self.sendFrameType = 0
self.audioCount = 0
......@@ -225,6 +243,7 @@ class StreamH264():
if conAudio:
framesAudio, lastDataAudio = self.getAudioFramesFromStr_2(dataAudio, lastDataAudio)
for fraAudio in framesAudio:
self.frameNum = self.frameNum + 1
if self.audioCount >= int(1000 / (self.singleFrameTimeAudio * 2)):
self.sendFrameType = 0
self.audioCount = 0
......@@ -289,7 +308,7 @@ class StreamH264():
print("发送消息:" + msg)
self.client.send(binascii.a2b_hex(msg))
time.sleep(self.sendDur)
print(self.pos)
# print(self.pos)
####################################################
# 读取aac文件并发送
......@@ -536,7 +555,7 @@ class StreamH264():
return frames,lastData
####################################################
# 获取音频帧(通过前面28个字节来截取)
# 获取音频帧(通过前面28来截取)
####################################################
def getAudioFramesFromStr_2(self,data,lastDataParam = ""):
if self.aacIsFront_28 == 0:
......@@ -570,25 +589,25 @@ class StreamH264():
frames.append(frame)
else:
lastData = data_H[i]
# for i in frames:
# print(self.aacFront_28 + frame)
return frames,lastData
if __name__ == "__main__":
obj = StreamH264()
obj.connectServer()
obj.setFPSVideo(24)
obj.setFPSAudio(54)
obj.setSendDur(0.001)
obj.setFPSVideo(30)
obj.setFPSAudio(47)
obj.setSendDur(0.005)
obj.setAVChangeBySecond(2)
obj.setVideoPath("../../h264/yyy.h264")
obj.setAudioPath("../../aac/yyy.aac")
# obj.readStreamFromFileAndSend("../../h264/bbb.h264") # 发送视频
# obj.readAacStreamFromFileAndSend("../../aac/bbb3.aac") # 发送音频
obj.sendAVStream()
obj.setVideoPath("../../h264/aaa3.h264")
obj.setAudioPath("../../aac/aaa3.aac")
# obj.readStreamFromFileAndSend("../../h264/aaa3.h264") # 发送视频
# obj.readAacStreamFromFileAndSend("../../aac/aaa3.aac") # 发送音频
obj.sendAVStream() # 同时发送音视频
# StreamH264().readTest("../../h264/aaa.h264")
# StreamH264().readTest2("../../h264/bbb3.h264")
# StreamH264().readTest2("../aac/aaa.aac")
# StreamH264().readTest2("../../aac/aaa.aac")
# StreamH264().readStreamFromFile("../h264/aaa2.264")
#coding: utf-8
import binascii
import socket
import time
from lib.protocal.Protocal_1078 import Protocal_1078
from lib.socket.ClientSocket import ClientSocket
class StreamH264Flv():
def __init__(self):
self.isFileHead = 1 # 读取文件的时候,是否是文件的开头 0:不是 1:是
self.readSize = 10240 # 读取文件的大小
self.isFileHead = 0 # 读取文件的时候,是否是文件的开头 0:不是 1:是
self.readSize = 1024 # 读取文件的大小
self.videoLastKeyTime = 0 # Last I Frame Interval 该祯与上一个关键祯之间的时间间隔,单位毫秒(ms),当数据类型为非视频祯时,则没有该字段
self.videoLastTime = 0 # Last Frame Interval 该祯与上一个祯之间的时间时间,单位毫秒(ms),当数据类型为非视频祯时,则没有该字段
self.sendDur = 0.003 # 每发送一帧的间隔时间
self.client = None
self.mobile = "013146201117" # 手机号
self.channel = 1 # 频道号
self.isSendAudio = 1 # 是否发送音频0:不发送 1:发送
self.host = "10.100.11.125"
# self.host = "10.16.12.249"
# self.host = "10.100.12.3"
# self.host = "localhost"
self.port = 1078
def setMobile(self,data):
self.mobile = data
def setChannel(self,data):
self.channel = data
def setReadSize(self,data):
self.readSize = data
def setIsSendAudio(self,data):
self.isSendAudio = data
def setHost(self,data):
self.host = data
def setPort(self,data):
self.port = data
def setSendDur(self,data):
self.sendDur = data
####################################################
# socket 连接
####################################################
def connectServer(self):
socketObj = ClientSocket()
socketObj.setHost(self.host)
socketObj.setPort(self.port)
self.client = socketObj.connect()
# self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
# self.client.connect((self.host, self.port))
####################################################
# 读取flv文件,并发送 (h264编码,并且音频为aac编码格式)
####################################################
def readFlvAndSend(self,fileName):
with open(fileName, 'rb') as fi:
con = fi.read(self.readSize)
self.isFileHead = 0
data = con.hex()
if self.isFileHead == 0:
pass
else:
data = data[18:]
self.isFileHead = 1
else:
data = data
while con:
if len(data) < 30:
con = fi.read(self.readSize)
data = con.hex()
data = data + con.hex()
else:
tagSize = self.getAVTagSize(data)
if len(data) < (tagSize * 2 + 30):
con = fi.read(self.readSize)
data = data + con.hex()
else:
tag = data[:tagSize * 2 + 30] # flv tag
tagType = self.getTagType(tag) # flv tag 类型,是音频 还是视频
AVtag = tag[30:] # 音视频 tag
avTimeStamp = self.getAVTimeStamp(tag) #获取时间戳
if tagType == "08": # 音频
AVdata = AVtag[4:] # 音频数据
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):]
####################################################
# 发送视频帧
####################################################
def sendVideoFrame(self,fra,timeStamp):
protocal_1078 = Protocal_1078()
protocal_1078.setSim(self.mobile)
protocal_1078.setLogcC(self.channel)
protocal_1078.setTime(timeStamp)
frameType = fra[8:10]
if frameType == "65":
self.videoLastKeyTime = timeStamp
protocal_1078.setLastKeyTime(timeStamp - self.videoLastKeyTime)
protocal_1078.setLastTime(timeStamp - self.videoLastTime)
self.videoLastTime = timeStamp
else:
protocal_1078.setLastKeyTime(timeStamp - self.videoLastKeyTime)
protocal_1078.setLastTime(timeStamp - self.videoLastTime)
self.videoLastTime = timeStamp
if len(fra) % 2 != 0: # 处理有问题的帧数据
print("出现了视频问题帧,并自动修复...")
fra = fra[:len(fra) - 1]
protocal_1078.setDataBody(fra)
pkgs = protocal_1078.genPkgsByFrame()
for msg in pkgs:
# print("发送视频消息:" + msg)
self.client.send(binascii.a2b_hex(msg))
time.sleep(self.sendDur)
####################################################
# 发送音频帧
####################################################
def sendAudioFrame(self,fra,timeStamp):
protocal_1078 = Protocal_1078()
protocal_1078.setSim(self.mobile)
protocal_1078.setLogcC(self.channel)
protocal_1078.setTime(timeStamp)
if len(fra) % 2 != 0: # 处理有问题的帧数据
print("出现了视频问题帧,并自动修复...")
fra = fra[:len(fra) - 1]
protocal_1078.setDataBody(fra)
pkgs = protocal_1078.genAudioPkgsByFrame()
for msg in pkgs:
# print("发送音频消息:" + msg)
self.client.send(binascii.a2b_hex(msg))
time.sleep(self.sendDur)
####################################################
......@@ -40,7 +161,7 @@ class StreamH264Flv():
tagSize = int(tagSize,16)
return tagSize
####################################################
# 获取相对时间戳
# 获取相对时间戳 (音视频相对时间)
####################################################
def getAVTimeStamp(self,tag):
timeStamp = tag[16:22]
......@@ -48,45 +169,77 @@ class StreamH264Flv():
return timeStamp
####################################################
# 获取音视频数据
# 获取音视频数据 (音视频头 + 数据部分)
####################################################
def getAVData(self,tag,tagSize):
flvData = tag[34:(tagSize * 2)]
lastData = tag[(tagSize * 2):]
return flvData,lastData
####################################################
# 读取文件(测试程序)
####################################################
def readTest(self,fileName):
with open(fileName, 'rb') as f2:
con = f2.read(204800)
data = con.hex() # 16进制字节码转字符串
data_H = data.split("00000001")
for i in range(1,len(data_H)):
print("00000001" + data_H[i])
# 根据AVtag,获取视频帧数据
####################################################
# 读取文件(测试程序)
####################################################
def readTest2(self,fileName):
with open(fileName, 'rb') as f2:
con = f2.read(512)
data = con.hex()
print(data)
def getVideoFrame(self,AVTag):
frameData = {}
frames = []
# frameData["frameType"] = int(AVTag[:2],16) >> 4 # 视频帧类型
frameData["codeId"] = int(AVTag[:2],16) & 7 # 编码id ,7 为h264编码 (程序里默认都是h264)
frameData["AVCPkgType"] = int(AVTag[2:4],16)
if frameData["AVCPkgType"] == 0:
spsLen = int(AVTag[22:26], 16)
sps = "00000001" + AVTag[26:26 + spsLen * 2]
ppsLen = int(AVTag[26 + spsLen * 2 + 2:26 + spsLen * 2 + 6],16)
pps = "00000001" + AVTag[26 + spsLen * 2 + 6:26 + spsLen *2 + 6 + ppsLen * 2]
frames.append(sps)
frames.append(pps)
frameData["frames"] = frames
elif frameData["AVCPkgType"] == 1:
dataLen = int(AVTag[10:18], 16)
frame = "00000001" + AVTag[18:18 + dataLen * 2]
frames.append(frame)
lastData = AVTag[18 + dataLen * 2:]
if len(lastData) != 0:
dataLen_65 = int(AVTag[18 + dataLen * 2:18 + dataLen * 2 + 8],16)
frame_65 = "00000001" + AVTag[18 + dataLen * 2 + 8:]
frames.append(frame_65)
else:
pass
frameData["frames"] = frames
elif frameData["AVCPkgType"] == 2:
frameData["frames"] = []
# print("2222222----------" + AVTag)
else:
frameData["frames"] = []
return frameData
####################################################
# 读取文件(测试程序),从指定位置开始读取
# 根据AVtag,获取音频帧数据
####################################################
def readTest3(self,fileName):
with open(fileName, 'rb') as f2:
f2.seek(4,0)
con = f2.read(1)
data = con.hex()
print(data)
def getAudioFrame(self,AVTag):
frameData = {}
frames = []
AVdata = AVTag[4:]
cp_id_bit = 0 << 27
cp_id_start = 0 << 26
aac_frame_length = int(len(AVdata) / 2 + 7) << 13
adts_buffer_funess = 2047 << 2
raw_data_frame = 0
infoAac = cp_id_bit + cp_id_start + aac_frame_length + adts_buffer_funess + raw_data_frame
infoAac = hex(infoAac)[2:]
while len(infoAac) < 7:
infoAac = "0" + infoAac
frame = "fff14c8" + infoAac + AVdata
frames.append(frame)
frameData["frames"] = frames
return frameData
if __name__ == "__main__":
StreamH264Flv().readTest2("../../flv/aaa.flv")
# StreamH264Flv().readTest2("../flv/aaah.h264")
# aaa = "02000a6f6e4d65746144617461080000001000086475726174696f6e0040695da1cac083120005776964746800407e0000000000000006686569676874004070e00000000000000d766964656f646174617261746500000000000000000000096672616d657261746500403e000000000000000c766964656f636f646563696400401c000000000000000d617564696f6461746172617465000000000000000000000f617564696f73616d706c65726174650040e7700000000000000f617564696f73616d706c6573697a65004030000000000000000673746572656f0101000c617564696f636f6465636964004000000000000000000b6d616a6f725f6272616e6402000469736f6d000d6d696e6f725f76657273696f6e0200033531320011636f6d70617469626c655f6272616e647302001069736f6d69736f32617663316d7034310007656e636f64657202000d4c61766635382e36352e313030000866696c6573697a650041621da1a00000000000090000017f0900003400000000000000170000000001640015ffe1001a67640015acd941e08feb0110000003001000000303c0f162d96001000668ebe3cb22c0fdf8f8000000003f09001f69000000000000001701000043000002ae0605ffffaadc45e9bde6d948b7962cd820d923eeef78323634"
# print(len(aaa))
# print(aaa[:744])
\ No newline at end of file
obj = StreamH264Flv()
obj.setSendDur(0.008)
obj.setIsSendAudio(1)
obj.setMobile("013146201117")
obj.setChannel(1)
obj.connectServer()
obj.readFlvAndSend("../../flv/yyy.flv")
# coding:utf-8
import socket
class ClientSocket():
def __init__(self):
self.host = "10.100.11.125"
self.port = 1078
self.timeOut = 1
self.client = None # 客户端socket对象
def setHost(self,data):
self.host = data
def setPort(self,data):
self.port = data
def setTimeOut(self,data):
self.timeOut = data
def connect(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳
self.client.connect((self.host, self.port))
return self.client
def send(self,data):
self.client.send(data)
def close(self):
self.client.shutdown(socket.SHUT_RDWR)
self.client.close()
\ No newline at end of file
......@@ -59,9 +59,9 @@ class H264PresureTest():
ret, frame = cap.read()
if ret == False:
break
# cv2.imshow("video", frame)
# if cv2.waitKey(1)&0xFF==ord('q'):
# break
cv2.imshow("video", frame)
if cv2.waitKey(1)&0xFF==ord('q'):
break
print("拉流结束")
cap.release()
cv2.destroyAllWindows()
......@@ -114,7 +114,7 @@ if __name__ == "__main__":
test.setPort(1078)
test.setMobileStart(10000000000)
test.setChannel(1)
test.setTerNum(20)
test.setTerNum(1)
test.setIsOpenPullStream(1) # 设置是否开启拉流
test.setVideoPath("../../h264/bbb3.h264")
test.setAudioPath("../../aac/bbb3.aac")
......
......@@ -7,9 +7,9 @@ while (cap.isOpened()):
ret, frame = cap.read()
if ret == False:
break
# cv2.imshow("video", frame)
# if cv2.waitKey(1)&0xFF==ord('q'):
# break
cv2.imshow("video", frame)
if cv2.waitKey(1)&0xFF==ord('q'):
break
print("拉流结束")
cap.release()
......
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