go语言实现的webrtc框架库 Pion WebRTC

go语言实现的webrtc框架库 Pion WebRTC

MIT
Google Go
跨平台
2019-08-04
newzai

纯go语言实现的webrtc框架库。可以用于开发webrtc服务器和webrtc客户端。API接口与JavaScript类似,减少学习成本。

示例代码:

package main

import (
	"fmt"
	"math/rand"
	"time"

	"github.com/pion/rtcp"
	"github.com/pion/webrtc/v2"

	"github.com/pion/webrtc/v2/examples/internal/signal"
)

func main() {
	// Everything below is the Pion WebRTC API! Thanks for using it ❤️.

	// Prepare the configuration
	config := webrtc.Configuration{
		ICEServers: []webrtc.ICEServer{
			{
				URLs: []string{"stun:stun.l.google.com:19302"},
			},
		},
	}

	// Create a new RTCPeerConnection
	peerConnection, err := webrtc.NewPeerConnection(config)
	if err != nil {
		panic(err)
	}

	// Create Track that we send video back to browser on
	outputTrack, err := peerConnection.NewTrack(webrtc.DefaultPayloadTypeVP8, rand.Uint32(), "video", "pion")
	if err != nil {
		panic(err)
	}

	// Add this newly created track to the PeerConnection
	if _, err = peerConnection.AddTrack(outputTrack); err != nil {
		panic(err)
	}

	// Set a handler for when a new remote track starts, this handler copies inbound RTP packets,
	// replaces the SSRC and sends them back
	peerConnection.OnTrack(func(track *webrtc.Track, receiver *webrtc.RTPReceiver) {
		// Send a PLI on an interval so that the publisher is pushing a keyframe every rtcpPLIInterval
		// This is a temporary fix until we implement incoming RTCP events, then we would push a PLI only when a viewer requests it
		go func() {
			ticker := time.NewTicker(time.Second * 3)
			for range ticker.C {
				errSend := peerConnection.WriteRTCP([]rtcp.Packet{&rtcp.PictureLossIndication{MediaSSRC: track.SSRC()}})
				if errSend != nil {
					fmt.Println(errSend)
				}
			}
		}()

		fmt.Printf("Track has started, of type %d: %s \n", track.PayloadType(), track.Codec().Name)
		for {
			// Read RTP packets being sent to Pion
			rtp, readErr := track.ReadRTP()
			if readErr != nil {
				panic(readErr)
			}

			// Replace the SSRC with the SSRC of the outbound track.
			// The only change we are making replacing the SSRC, the RTP packets are unchanged otherwise
			rtp.SSRC = outputTrack.SSRC()
			rtp.PayloadType = webrtc.DefaultPayloadTypeVP8

			if writeErr := outputTrack.WriteRTP(rtp); writeErr != nil {
				panic(writeErr)
			}
		}
	})
	// Set the handler for ICE connection state
	// This will notify you when the peer has connected/disconnected
	peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
		fmt.Printf("Connection State has changed %s \n", connectionState.String())
	})

	// Wait for the offer to be pasted
	offer := webrtc.SessionDescription{}
	signal.Decode(signal.MustReadStdin(), &offer)

	// Set the remote SessionDescription
	err = peerConnection.SetRemoteDescription(offer)
	if err != nil {
		panic(err)
	}

	// Create an answer
	answer, err := peerConnection.CreateAnswer(nil)
	if err != nil {
		panic(err)
	}

	// Sets the LocalDescription, and starts our UDP listeners
	err = peerConnection.SetLocalDescription(answer)
	if err != nil {
		panic(err)
	}

	// Output the answer in base64 so we can paste it in browser
	fmt.Println(signal.Encode(answer))

	// Block forever
	select {}
}

 

的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

WebRTC实时互动直播技术入门与实战 5G时代必备技能

WebRTC实时互动直播技术入门与实战 5G时代必备技能 5G时代下,音视频行业将会得到前所未有的蓬勃发展,音视频人才将成为新的宠儿。本课程将从入门到实战,系统讲解WebRTC实时互动直播技术【音...

06/24 16:26
20
0
[翻译] 通过WebRTC技术实现点对点通信

WebRTC是一个实验性技术。 因为这种技术的规格还没有稳定下来,在各种浏览器中必须通过检查属性表的前缀来正确使用,例如:在Chrome中使用 webkitRTCPeerConnection,在Firefox中使用mozRTCP...

2014/03/20 17:17
1K
1
直播为什么不使用WebRTC?

视频直播的兴起对于WebRTC来说是一次很好的机遇。 自2015年以来直播行业增长了3 ~ 5倍,这是一个很惊人的增长速度,但如何将WebRTC和直播联系到一起,这并不是一个老生常谈的问题,在这里any...

2018/09/26 17:11
91
1
WebRTC 初体验

先不讲什么是WebRTC,通过下面的两个 demo , 初步体验下 WebRTC 的威力,看看能给我们带来什么惊喜~

2015/11/17 10:38
451
1
WebRTC:基于物联网的行业化应用

根据anyRTC官方运营数据分析预测,到2020年物联网设备的数量将达到近210亿。随着工业产品,可穿戴设备和智能家用电器的不断涌现,它们的多样性正在迅速增长。物联网产品的数据收集和通信功能...

2018/09/17 10:07
27
1
了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化

有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据。与此同时,越来越多的浏览器和厂商都开始对它进行广泛的支持,或许门槛如此之高的实时音视频技术终有...

2018/06/04 12:26
51
0
通过WebRTC实现实时视频通信(三)

在这篇文章中我们继续了解WebRTC的相关API,RTCPeerConnectiont和RTCDataChannel。

2014/09/23 16:39
126
0
WebRTC与Ace在线代码编辑器合作,实现实时协作编程

日期:2013-5-17 来源:GBin1.com 距离WebRTC真正的应用到一些很酷的应用中还有一段时日,但是即便是这样,很多开发人员也从体验WebRTC炫酷,例如Mozilla/Google电话演示,快速转移到了更为实...

2013/05/17 18:21
159
1
WebRTC实现很难?让我们看看Mozilla是如何做的

日期:2013-3-24 来源:GBin1.com WebRTC改变了网络,它帮助我们在几个月前不可能实现的,连想都不敢想的事情变成了现实。无论是通过访问URL就可以进行视频聊天,还是在你的社交网络中共享文...

2013/03/26 16:58
358
0
WebRTC实现很难?让我们看看Mozilla是如何做的

日期:2013-3-24 来源:GBin1.com WebRTC改变了网络,它帮助我们在几个月前不可能实现的,连想都不敢想的事情变成了现实。无论是通过访问URL就可以进行视频聊天,还是在你的社交网络中共享文...

2013/04/15 19:53
170
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部