uni-app 对接腾讯云直播 tcp通道发送失败 错误码[-4] ""code":3005 所有IP都已经尝试失败,可以放弃治疗
使用vue2开发小程序,但是无法成功连接推流。
请教一下各位朋友,有没有人在对接腾讯云直播的时候遇到以下报错,处理好就来,没解决。能不能帮忙看一下,感谢。
错误日志是这样的,一直重连:
"videoHeight":.1280,"audioBitrate":.O,"videoFPS".18"videoBitrat
e":0"netSpeed":0"videoGOp":3,"videoWidth":720."netJitter":077
状态日志:Imessage" 'tcp通道发送失败 错误码1-4]
""code":3005}
状态日志:"'message":"UNKNOWN','code":3004¥
状态日志:™'message':'rtmp开始推流"'code':10023
状态日志:°'message'”"已经连接rtmp服务器"'code':10013
状态日志:°message”:"启动网络重连"'code":11021
网络日志:tinfo’
{'videoHeight":1280,"audioBitrate":0,"videoFPS":17,"videoBitrat
e":0."netSpeed":0."videoGOp":.3."videoWidth":720."netJitter":077
状态日志:™message”:'tcp通道发送失败 错误码1-4]
""code":3005}
状态日志:"message'":'UNKNOWN''code":30043
网络日志:Yinfo”
{"videoHeight":.1280,"audioBitrate":0,"videoFPS":17,"videoBitrat
e':0,'netspeed':0,'videoGOP":3, videoWidth":720,'netJitter":0f
状态日志:1message':'rtmp开始推流""code':10023
状态日志::'message”"已经连接rtmp服务器" code":10013
状态日志:8message'""启动网络重连"'code':11021
网络日志:rinfo'
{"videoHeight":.1280,"audioBitrate":O."videoFPS":17."videoBitrat
e".0,"netSpeed":0."videoGOP":.3,"videoWidth":.720,"netJitter":.O7}
状态日志:"message” 'tcp通道发送失败 错误码1-4]
""code":3005}
状态日志:™'message”'UNKNOWN','code':3004
状态日志:™message”':'rtmp开始推流"'code':10021
网络日志:{"info"
["videoHeight":1280,"audioBitrate":0,"videoFPS":.15,"videoBitrat
e":0,"netSpeed":0,"videoGOP":3,"videoWidth":720,"netJitter":O}
状态日志:"message”"已经连接rtmp服务器",'code':10013
状态日志:1message”:"首帧画面采集完成"'code':10073
状态日志:i'message”•"打开摄像头成功" code”10033
状态日志:"'message”"启动硬编""code ".10083
状态日志:!message”"首帧画 面采集完成"code”1007
状态日志;*message”:"打开摄像头成功",'code'10033
最后会出现:
26 statechange:{"type":"statechange","timeStamp":1691384562331,"target":{"id":"livePusher","dataset":{},"offsetLeft":0,"offsetTop":0},"currentTarget":{"id":"livePusher","dataset":{},"offsetLeft":0,"offsetTop":0},"detail":{"message":"所有IP都已经尝试失败,可以放弃治疗
我的代码是这样的:
<template>
<view>
<button type="default" @click="onPush('h5p')" style="display: none;">h5p_推流按钮(废弃:码率无法调整)</button>
<button type="default" @click="onPush('weex')">weex_推流按钮</button>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
onPush(str) {
uni.navigateTo({
url: '../push/push_' + str
});
}
}
}
</script>
<style>
</style>
<template>
<view>
<live-pusher id="livePusher" :url="url" :enable-camera="enableCamera" :mode="mode" :device-position="devicePosition"
:orientation="orientation" :muted="muted" :beauty="beauty" :whiteness="whiteness" :remote-mirror="remoteMirror"
:auto-focus="autoFocus" :zoom="zoom" :style="{height: windowHeight}" @statechange="statechange" @netstatus="netstatus"
@error="error"></live-pusher>
</view>
</template>
<script>
export default {
data() {
return {
url: '',
enableCamera: true,
pusher: null,
isPushing: false,
windowHeight: '0px',
orientation: 'vertical',
devicePosition: 'front',
mode: 'FHD',
muted: false,
beauty: 0,
whiteness: 0,
zoom: true,
autoFocus: true,
remoteMirror: true
};
},
onLoad(options) {
this.url = options.push_url
this.orientation = options.orientation
this.devicePosition = options.devicePosition
this.mode = options.mode
this.beauty = options.beauty / 10
this.whiteness = options.whiteness / 10
this.zoom = options.zoom
this.autoFocus = options.autoFocus
},
onReady() {
this.windowHeight = uni.getSystemInfoSync().windowHeight + 'px';
this.pusher = uni.createLivePusherContext('livePusher', this);
this.pusher.startPreview()
uni.$on('onStart', this.onStart)
uni.$on('onSwitchCamera', this.onSwitchCamera)
uni.$on('onMuted', this.onMuted)
},
methods: {
onStart() {
this.isPushing = !this.isPushing
if (this.isPushing) {
this.pusher.start()
} else {
this.pusher.stop({
success: () => {
this.pusher.startPreview()
}
})
}
uni.$emit('switchStartBtn', {
startBtn: this.isPushing
})
},
onSwitchCamera() {
this.pusher.switchCamera()
uni.$emit('switchCameraBtn', {})
},
onMuted() {
this.muted = !this.muted
uni.$emit('switchMutedBtn', {
mutedBtn: this.muted
})
},
statechange(e) {
let detail = e.detail
// console.log("状态日志:" + JSON.stringify(detail))
uni.$emit("appendLogs", {
msg: "状态日志:" + JSON.stringify(detail)
});
},
netstatus(e) {
let detail = e.detail
// console.log("网络日志:" + JSON.stringify(detail))
uni.$emit("appendLogs", {
msg: "网络日志:" + JSON.stringify(detail)
});
},
error(e) {
let detail = e.detail
// console.log("错误日志:" + JSON.stringify(detail))
uni.$emit("appendLogs", {
msg: "错误日志:" + JSON.stringify(detail)
});
}
}
};
</script>
<style>
</style>
网络问题:TCP通道发送失败可能是由于网络连接不稳定或网络延迟导致的。确保设备能够正常连接到互联网,并尽量在稳定的网络环境下进行测试。
防火墙或网络代理:防火墙或网络代理可能会阻止TCP通道的连接。确保你的网络环境允许TCP连接,并且没有被防火墙或网络代理拦截。
域名解析问题:如果在代码中使用了域名进行连接,确保域名解析正确,可以尝试使用直接IP地址进行连接。
端口问题:确认使用的TCP端口是否正确,并且服务器端允许该端口进行连接。
签名或认证问题:腾讯云直播通常需要进行签名或认证才能建立连接。确保你正确地配置了相关的签名或认证信息。
SDK版本问题:确保你使用的腾讯云直播SDK版本是最新的,并且与uni-app的版本兼容。
权限问题:腾讯云直播可能需要一些特定的权限才能使用。确保你在腾讯云后台正确地配置了相关的权限。
请求频率限制:腾讯云可能对API请求频率进行限制。确保你的请求频率没有超过腾讯云的限制。
错误处理:在代码中进行错误处理,捕获和处理可能的异常,以便更好地排查问题。
参考gpt:
结合自己分析给你如下建议:
您的推流地址是否正确?您需要确保推流地址是以 rtmp:// 开头的,并且包含了 txSecret、txTime 等防盗链参数。您可以参考推拉流 URL 拼接来生成正确的推流地址。
您的网络是否正常?您需要确保您的网络能够访问 rtmp:// 协议,并且没有被防火墙或者其他因素阻断。您可以尝试切换网络或者使用其他设备来测试推流。
您的推流 URL 是否被占用?一个推流 URL 同时只能有一个推流端,如果有其他客户端正在使用同一个推流 URL,您的推流会被拒绝。您可以登录直播控制台,在流管理的在线流中查看此条流是否已经在推,也可以在禁推流中查看该条流是否被禁推。
您的 txTime 是否过期?如果您的 txTime 设置得过于短,当主播在直播过程中遭遇网络闪断时会因为推流 URL 过期而无法恢复推流。建议设置为当前时间往后推 12 或者 24 小时为宜,也就是要长于一场普通直播的直播时间。
您的 txSecret 是否正确?如果您的 txSecret 计算错误或者已经过了有效期,您的推流会被腾讯云踢掉。您可以参考防盗链签名来计算正确的 txSecret。
@ada 帮忙回答一下
看出您在使用uni-app对接腾讯云直播时遇到了连接推流失败的问题。错误码[-4]表示所有IP都已经尝试失败,无法建立连接。根据您的代码,我看到您使用了live-pusher
组件来进行推流操作。
首先,您需要确保您的推流地址(url
)是正确的,并且已经在腾讯云直播控制台配置好了推流域名和推流密钥。
其次,您可以尝试以下几个步骤来解决连接推流失败的问题:
检查网络连接:确保您的设备可以正常连接互联网,并且网络稳定。
检查权限设置:在使用摄像头和麦克风进行推流时,需要获取用户的授权。您可以在onReady
生命周期函数中调用uni-app的API来请求用户授权。
检查设备支持:某些设备可能不支持推流功能,您可以在onReady
生命周期函数中调用uni-app的API来检测设备是否支持推流。
检查推流参数:您可以尝试调整推流参数,如分辨率、码率等,以适应不同的网络环境和设备性能。
检查腾讯云直播配置:确保您在腾讯云直播控制台正确配置了推流域名和推流密钥,并且已经启用了推流功能。
如果您尝试了以上步骤仍然无法解决问题,建议您查阅uni-app和腾讯云直播的官方文档,或者咨询腾讯云直播的技术支持,以获取更详细的帮助和指导。