当前位置: 首页 > 软件库 > 程序开发 > 网络工具包 >

Pion WebRTC

go 语言实现的 webrtc 框架库
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 网络工具包
软件类型 开源软件
地区 不详
投 递 者 充昌勋
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Pion WebRTC 是纯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 {}
}

 

  • 前言 pion是一个纯用golang写的开源webrtc项目,目前github上大部分webrtc开源都是使用c++写的。本人认为pion对于一个webrtc入门者来说golang的语法相对简单,你这样可以更好的关注webrtc协议。如果业务场景不是特别高,业务上只做sfu转发服务器的话,可以尝试用golang来做。 读这篇文章你需要稍微了解webrtc的协议。 例子 pion也有提供不少的例子,

  • 音视频的录制音视频的分为服务端录制和客户端录制,下面主要讲的是利用webrtc进行客户端录制的方式。 因为WebRTC 录制音视频流之后,最终是通过 Blob 对象将数据保存成多媒体文件的, Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。 Blob 表示的不一定是JavaScript原生格式

  • 首先我们知道,Rtmp是一种客户端到服务端的技术,Peer to Server。WebRTC是一种客户端到客户端的技术,Peer to Peer。 Rtmp通过一个TCP连接,向服务端发送或接收连接信息,媒体数据。 WebRTC先使用ICE技术连接STUN/TURN,得到自己的连接信息。再绑定音视频设备获取媒体信息,拼装为SDP信令。两个客户端通过任意方式交换信令,建立客户端直接的连接,再使用RT

  • 推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习 stream_test.go package stream import ( "testing" "time" ) func Tes

 相关资料
  • 本文向大家介绍laravel框架语言包拓展实现方法分析,包括了laravel框架语言包拓展实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了laravel框架语言包拓展实现方法。分享给大家供大家参考,具体如下: laravel 使用make:auth生成用户认证,登录表单是英文版本的,打开模板文件(resources/views/auth/login.blade.php),此模板

  • 本文向大家介绍易语言的超文本浏览框实现,包括了易语言的超文本浏览框实现的使用技巧和注意事项,需要的朋友参考一下 添加一个按钮 页面内可以点击跳转 出现错误 解决办法 实验效果

  • 我遇到以下异常: JAVAlang.IllegalArgumentException:没有实现以下指定的架构语言的SchemaFactory:http://www.w3.org/2001/XMLSchema-instance可以在javax上加载。xml。验证。SchemaFactory。MAIN上的newInstance(SchemaFactory.java:204)。SchemaImport3

  • 本文向大家介绍详解python的webrtc库实现语音端点检测,包括了详解python的webrtc库实现语音端点检测的使用技巧和注意事项,需要的朋友参考一下 引言 语音端点检测最早应用于电话传输和检测系统当中,用于通信信道的时间分配,提高传输线路的利用效率.端点检测属于语音处理系统的前端操作,在语音检测领域意义重大. 但是目前的语音端点检测,尤其是检测 人声 开始和结束的端点始终是属于技术难点,

  • 通过使用Java语言实现一个完整的框架设计,这个框架中主要内容有第一小节介绍的Web框架的结构规划,例如采用MVC模式来进行开发,程序的执行流程设计等内容;第二小节介绍框架的第一个功能:路由,如何让访问的URL映射到相应的处理逻辑;第三小节介绍处理逻辑,如何设计一个公共的 调度器,对象继承之后处理函数中如何处理response和request;第四小节至第六小节介绍如何框架的一些辅助功能,例如配置

  • 1. 前言 通过几个章节的学习,大家对于 Spring 已经有了初步的认知,我们通过案例练习,或者源码追踪,可以粗略的看到 Spring 框架初始化 bean 对象的过程,那么这个章节,我们模拟 Spring 框架的思路,来写一个类似 Spring 加载对象的案例,加深大家的印象。 2. 案例实现思路 2.1 步骤介绍 思路分析: 我们通过写过的案例可以知道: Spring 框架的容器 是一个接口

  • 本文向大家介绍在Python的Django框架中创建语言文件,包括了在Python的Django框架中创建语言文件的使用技巧和注意事项,需要的朋友参考一下 当你标记了翻译字符串,你就需要写出(或获取已有的)对应的语言翻译信息。 这里就是它如何工作的。 地域限制 Django不支持把你的应用本地化到一个连它自己都还没被翻译的地域。 在这种情况下,它将忽略你的翻译文件。 如果你想尝试这个并且Djang

  • 嗨,我使用Play框架2.4.3和scala版本2.11我使用放心scala支持测试路线,但我得到 经过研究,我发现Junit导致了rest assured hamcrest matcher NoSuchMethodError的问题,hamcrest 1.3 这是构建。sbt文件内容 这是异常日志 请帮助说明导致异常的原因