国家標準GB28181ストリーミングメディアプロトコルビデオプラットフォームEasyGBSカスケード上位レベルプラットフォーム音声複製問題ソリューション

国家標準のGB28181プロトコルビデオプラットフォームEasyGBSは、GB28181プロトコルを介してカスケードできます。HaikangやUnivisionなどのビデオプラットフォームとのカスケードに加えて、開発者独自のビデオプラットフォームとカスケードすることもできます(EasyGBSが優れたビデオストリーミングを実現する方法ユナイテッド)。

GBS製品アーキテクチャ3平面definition.png

EasyGBSビデオプラットフォームは、上位レベルのプラットフォームの音声にカスケードすることもできますが、カスケード音声のテスト中に、上位レベルの音声は初めて正常でしたが、2回目以降に送信された音声は前の音声であることがわかりました。

したがって、パケットをキャプチャして問題の原因を分析すると、パケットキャプチャの結果から、1番目と2番目のオーディオに一貫性があることがわかります。

65.png

ただし、オーディオが2回目に収集されると、上位レベルのプラットフォームは新しく収集されたオーディオを送信し、下位レベルのプラットフォームは最後のオーディオをデバイスに送信します。

66.png

調査コードは、確立された各udpリンクがバッファーされたbuf配列で読み取られ、udpモニタリングリンクが閉じられていないため、データの混乱を引き起こし、最後のデータを送信することがわかりました。

case audioOnOff := <-Server.UacAudioOnOff[key]:
				if dataConn != nil {
					Server.UacAudioUdpConn[key] = nil
					bufUDP := make([]byte, 102400)
					//err := dataConn.SetReadDeadline(time.Now().Add(time.Second * 5))
					//if err != nil {
					//	Server.UacAudioUdpConn[key].Close()
					//	log.Println("超时处理")
					//	return
					//}
					time.Sleep(time.Second * 1)
					for audioOnOff {
						n, _, err := dataConn.ReadFromUDP(bufUDP)
						if err != nil {
							//Server.UacAudioUdpConn[key].Close()
							log.Printf("udp read error, %v", err)
							continue
						}
						rtpBuf := make([]byte, n)
						copy(rtpBuf, bufUDP[:n])
						tempint, err := transportMS.UDPConn.Write(rtpBuf)
						if err != nil {
							log.Printf("发送rtperr : %s  ,tempint :%d", err, tempint)
							return
						}
						time.Sleep(80 * time.Millisecond)
						log.Println("发送tempint", tempint)
					}

				}

次のコードを追加する必要があります

Server.UacAudioUdpConn[key] = nil

udp接続を取得するたびに、今回使用したリンクを空白のままにします。

case audioOnOff := <-Server.UacAudioOnOff[key]:
				if dataConn != nil {
					Server.UacAudioUdpConn[key] = nil
					bufUDP := make([]byte, 102400)
					//err := dataConn.SetReadDeadline(time.Now().Add(time.Second * 5))
					//if err != nil {
					//	Server.UacAudioUdpConn[key].Close()
					//	log.Println("超时处理")
					//	return
					//}
					time.Sleep(time.Second * 1)
					for audioOnOff {
						n, _, err := dataConn.ReadFromUDP(bufUDP)
						if err != nil {
							//Server.UacAudioUdpConn[key].Close()
							log.Printf("udp read error, %v", err)
							continue
						}
						rtpBuf := make([]byte, n)
						copy(rtpBuf, bufUDP[:n])
						tempint, err := transportMS.UDPConn.Write(rtpBuf)
						if err != nil {
							log.Printf("发送rtperr : %s  ,tempint :%d", err, tempint)
							return
						}
						time.Sleep(80 * time.Millisecond)
						log.Println("发送tempint", tempint)
					}

				}

再度使用すると、毎回送信される音声は上司が送信する音声と同じになります。

注:カメラデバイスが音声をサポートしている場合、EasyGBSカスケードを介して音声を受信できます。カメラデバイスが音声をサポートしていない場合、カメラデバイスは音声を受信できません。

EasyGBSビデオプラットフォームは、パンチルト制御をサポートし、動的ネットワーキングサービスに基づくインテリジェントネットワークを作成し、ポイントツーポイント相互接続を実現するためにネットワーキングを必要とするネットワークメンバーを選択し、RTSP、RTMP、HTTP-FLV、HLSなどの複数のストリーム出力を提供できます。複数のプロトコルストリーム。ユーザーは、独自のプロジェクト要件に応じて適切なビデオストリームを選択できます。

GBS6.png

EasyGBSに加えて、TSINGSEE Qingxi Videoには、RTSPプロトコルをサポートするEasyNVRやRTMPプロトコルをサポートするEasyDSSビデオプラットフォームなど、他のビデオソリューションもあります。ビデオ関連のソリューションの詳細については、お問い合わせください。

おすすめ

転載: blog.csdn.net/EasyGBS/article/details/108659313