WebRTC的Android端互连

关于WebRTC视频Android端实现的原理解读 进入公司之后做了第一个项目就是关于视频的,因为用的是别人提供的sdk,所以说很容易就能实现其中的功能,那么项目结尾的时候就想着不能光会用,起码得知道原理过程吧!那么下面就讲解一下本人对关于WebRTC的视频连接过程的一些讲解:关于WebRTC这个库。 阅读详情

公司让做一个小项目作为入职测试,简单的说就是实现WebRTC的Android端互连。boss给提供了一个开源项目作为参考,这个项目是WebRTC的android客户端,可以实现android端连接PC端——在我动手之前我以为自己要建一栋房子,然而最后只是挂了个窗帘,不过至少知道了房子的构造O(∩_∩)O~

环境准备

参考项目1:https://github.com/pchab/ProjectRTC

ProjectRTC是一个WebRTC的PC端项目,实现了WebRTC的服务器功能和PC客户端功能,我们拿来当服务器用的,运行需要安装Node.js。使用方法如下:

  • 安装Node.JS
  • ProjectRTC根目录下,命令行:npm install
  • 命令行:node app.js (虽然ProjectRTC说明中让输入:npm start,然是打开之后就关不掉了,会自启动的,而且不带任何控制台提示)

参考项目2:https://github.com/pchab/AndroidRTC

AndroidRTC是ProjectRTC的android客户端,下载后直接AndroidStudio打开。AndroidRTC中包含两个moudle,app是主界面,webrtc-client是工具类moudle 。

添加WebRTC库

需要去官网下载源码,然后到Linux下编译,最后放到Android项目中并添加依赖和权限(很麻烦的样子,所幸参考项目2已经帮我们配置好了,偷下懒^_^)

背景知识

WebRTC被誉为是web长期开源开发的一个新启元,是近年来web开发的最重要创新。WebRTC允许Web开发者在其web应用中添加视频聊天或者点对点数据传输,不需要复杂的代码或者昂贵的配置。目前支持Chrome、Firefox和Opera,后续会支持更多的浏览器,它有能力达到数十亿的设备。

然而,WebRTC一直被误解为仅适合于浏览器。事实上,WebRTC最重要的一个特征是允许本地和web应用间的互操作,自然也可以在Android应用中植入WebRTC 。

WebRTC Android端的大体实现过程如下:(在不考虑播放本地视频的情况下)

  • 连接服务器,并通过服务器打通两个客户端的网络通道。
  • 从摄像头和麦克风获取媒体流 。
  • 将本地媒体流通过网络通道传送给对方的客户端 。
  • 渲染播放接收到的媒体流 。

关键技术

核心类PeerConnectionFactory

首先需要初始化PeerConnectionFactory,这是WebRTC的核心工具类,初始化方法如下:

PeerConnectionFactory.initializeAndroidGlobals(
    context,//上下文,可自定义监听
    initializeAudio,//是否初始化音频,布尔值
    initializeVideo,//是否初始化视频,布尔值
    videoCodecHwAcceleration,//是否支持硬件加速,布尔值
    renderEGLContext);//是否支持硬件渲染,布尔值
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后就可以获得对象:PeerConnectionFactory factory= new PeerConnectionFactory();

获取媒体流

第一步:获取视频源videoSource

String frontCameraName = VideoCapturerAndroid.getNameOfFrontFacingDevice();
VideoCapturer videoCapturer = VideoCapturerAndroid.create(frontCameraName);
VideoSource videoSource = factory.createVideoSource(videoCapturer,videoConstraints);
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

其中videoConstraints是对视频流的一些限制,按如下方法创建。

MediaConstraints videoConstraints = new MediaConstraints();
videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxHeight", Integer.toString(pcParams.videoHeight)));
videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxWidth", Integer.toString(pcParams.videoWidth)));
videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("maxFrameRate", Integer.toString(pcParams.videoFps)));
videoConstraints.mandatory.add(new MediaConstraints.KeyValuePair("minFrameRate", Integer.toString(pcParams.videoFps)));
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

第二步:获取音频源audioSource

音频源的获取简单许多:

AudioSource audioSource = factory.createAudioSource(new MediaConstraints());
 
  • 1
  • 1

第三步:获得封装VideoTrack/AudioTrack

VideoTrack/AudioTrack 是 VideoSource/AudioSource 的封装,方便他们的播放和传输:

VideoTrack videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource);
AudioTrack audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource);
 
  • 1
  • 2
  • 1
  • 2

第四步:获取媒体流localMS

其实 VideoTrack/AudioTrack 已经可以播放了,不过我们先不考虑本地播放。那么如果要把他们发送到对方客户端,我们需要把他们添加到媒体流中:

MediaStream localMS=factory.createLocalMediaStream("ARDAMS");
localMS.addTrack(videoTrack);
localMS.addTrack(audeoTrack);
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

然后,如果有建立好的连接通道,我们就可以把 localMS 发送出去了。

建立连接通道

WebRTC是基于P2P的,但是在连接通道建立好之前,我们仍然需要服务器帮助传递信令,而且需要服务器帮助进行网络穿透。大体需要如下几个步骤。

第一步:创建PeerConnection的对象。

PeerConnection pc = factory.createPeerConnection(
    iceServers,//ICE服务器列表
    pcConstraints,//MediaConstraints
    context);//上下文,可做监听
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

iceServers 我们下面再说。
pcConstraints是媒体限制,可以添加如下约束:

pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"));
pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));
pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

监听器建议同时实现SdpObserver、PeerConnection.Observer两个接口。

第二步:信令交换

建立连接通道时我们需要在WebRTC两个客户端之间进行一些信令交换,我们以A作为发起端,B作为响应端(A call B,假设服务器和A、B已经连接好,并且只提供转发功能,PeerConnection对象为pc ):

  • A向B发出一个“init”请求(我觉得这步没有也行)。
  • B收到后“init”请求后,调用pc.createOffer()方法创建一个包含SDP描述符(包含媒体信息,如分辨率、编解码能力等)的offer信令。
  • offer信令创建成功后会调用SdpObserver监听中的onCreateSuccess()响应函数,在这里B会通过pc.setLocalDescription将offer信令(SDP描述符)赋给自己的PC对象,同时将offer信令发送给A 。
  • A收到B的offer信令后,利用pc.setRemoteDescription()方法将B的SDP描述赋给A的PC对象。
  • A在onCreateSuccess()监听响应函数中调用pc.setLocalDescription将answer信令(SDP描述符)赋给自己的PC对象,同时将answer信令发送给B 。
  • B收到A的answer信令后,利用pc.setRemoteDescription()方法将A的SDP描述赋给B的PC对象。

这样,A、B之间就完成里了信令交换。

第三步:通过ICE框架穿透NAT/防火墙

如果在局域网内,信令交换后就已经可以传递媒体流了,但如果双方不在同一个局域网,就需要进行NAT/防火墙穿透(我是在局域网下测试的,没有穿透,但还是把这方面内容介绍下)。

WebRTC使用ICE框架来保证穿透。ICE全名叫交互式连接建立(Interactive Connectivity Establishment),一种综合性的NAT/FW穿越技术,它是一种框架,可以整合各种NAT/FW穿越技术如STUN、TURN(Traversal Using Relay NAT 中继NAT实现的穿透)。ICE会先使用STUN,尝试建立一个基于UDP的连接,如果失败了,就会去TCP(先尝试HTTP,然后尝试HTTPS),如果依旧失败ICE就会使用一个中继的TURN服务器。使用STUN服务器穿透的结构如下:
这里写图片描述
我们可以使用Google的stun服务器:stun:stun.l.google.com:19302(Google嘛,翻墙你懂得,当然如果有精力可以自己搭建一个stun服务器),那么我们怎么把这个地址告诉WebRTC呢,还记得之前的iceServers吗,就是在创建PeerConnection对象的时候需要的参数,iceServers里面存放的就是进行穿透地址变换的服务器地址,添加方法如下(保险起见可以多添加几个服务器地址,如果有的话):

iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302"));
 
  • 1
  • 1

然后这个stun服务器地址也需要通过信令交换,同样以A、B客户端为例过程如下:

  • A、B分别创建PC实例pc(配置了穿透服务器地址) 。
  • 当网络候选可用时,PeerConnection.Observer监听会调用onIceCandidate()响应函数并提供IceCandidate(里面包含穿透所需的信息)的对象。在这里,我们可以让A、B将IceCandidate对象的内容发送给对方。
  • A、B收到对方发来的candidate信令后,利用pc.addIceCandidate()方法将穿透信息赋给各自的PeerConnection对象。

至此,连接通道完全打通,然后我们只需要将之前获取的媒体流localMS赋给pc即可:

pc.addStream(localMS);//也可以先添加,连接通道打通后一样会触发监听响应。
 
  • 1
  • 1

在连接通道正常的情况下,对方的PeerConnection.Observer监听就会调用onAddStream()响应函数并提供接收到的媒体流。

播放媒体流

WebRTC提供了一种很方便的播放方式:VideoRendererGui,首先设置VideoRendererGui,具体方法如下:

GLSurfaceView videoView = (GLSurfaceView) findViewById(R.id.glview_call);
VideoRendererGui.setView(videoView, runnable);//surface准备好后会调用runnable里的run()函数
 
  • 1
  • 2
  • 1
  • 2

然后创建一个VideoRenderer对象,并将其赋给videoTrack:

VideoRenderer renderer = VideoRendererGui.createGui(x, y, width, height);//设置界面
videoTrack.addRenderer(renderer);
 
  • 1
  • 2
  • 1
  • 2

WebRTC允许我们实现自己的渲染,我们只需通过VideoRendererGui获取VideoRenderer.Callbacks的对象,渲染后把其作为参数传入到VideoRenderer的构造方法即可。

此外利用VideoRenderer.Callbacks,我们可以动态调整播放界面,如下:

VideoRenderer.Callbacks cbRenderer = VideoRendererGui.create(x, y, width, height, scalingType, mirror);//设置界面
videoTrack.addRenderer(new VideoRenderer(cbRenderer ));
VideoRendererGui.update(cbRenderer ,x, y, width, height, scalingType);//调整界面
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

信令服务器

信令服务器主要是在客户端打通连接通道前传递信令的,在客户端开启P2P通道后,这个服务器关了也不会影响媒体流传输。

我是用ProjectRTC作为服务器,这个项目里还包括PC客户端的实现,不过我们不用管它们,ProjectRTC项目根目录下的app.js是入口文件,里面设置必要参数,如网口等。我们需要关注的文件是app文件夹下的:socketHandler.js 和 streams.js 文件。

socketHandler.js 是服务器用来和客户端交互的接口,里面的实现网口的监听,每有新的连接接入,都在这里进行存储。通过分析这个文件可以发现,所有连接的socket都存放在sockets对象中,标志是socket.id,socket的收发函数也是在这里定。

streams.js是一个存储的工具类,里面有两个成员:id和name,这个文件用来存放已经准备好打通连接通道的客户端的信息,name是客户端的名字,id是连接对应客户端的socket的id 。

如果我们要实现客户端的信令交互,只需要修改这两个文件即可(实际上基本不用改)。

开发历程

说是开发,其实就是学习下而已O(∩_∩)O~

首先拿到题目后,我去查阅相关技术,因为之前并不了解WebRTC,我还以为是个浏览器的插件什么的。看了半天发现只能了解概要,还是先看看demo吧。

将boss提供的参考项目下载,安装,运行——没效果,或者说我看不懂它的效果/(ㄒoㄒ)/~~ 。没办法,开始看代码吧,由于没接触过node.js,所以先看AndroidRTC,幸运的AndroidRTC的代码很少,一个Activity,一个RTC核心类,一个参数类。

很快将代码过了一遍,发现android端的demo异常简陋,打开就是连接服务器,然后获取本地视频,获取本地视频的相关内容很快就理清了,关键是P2P通道的打通很麻烦,由于本人对网络方面知识的匮乏(其实你哪里都匮乏好吧。。),看的云里雾里,只好又回去看别人的技术博客,然后对着代码一点一点梳理。

这期间我总是试着给Android端加个登录界面,但是每每构思到一段就不行了,为什么?因为那时我还没有搞清楚WebRTC是怎么进行信令交互的,浪费不少时间。

期间测试demo时又发现正常了,是我翻墙时发现的,我发现PC客户端只有在我翻墙时才有用,然后打开手机客户端发现可以正常连接通话,不过我没必要去看PC的客户端是怎么回事,这时我已经理清了Android的结构,AndroidRTC的demo是这样的:

在你打开服务器的情况下,打开Android端app,app会首先连接服务器(根据写好的地址),然后服务器发送一个标志给app(这个标志其实是服务器端连接app的socket的id),之后app端会判断:是否有一个callerId,有的话直接开始打通连接通道,没有的话等待,并且获取播放自己的媒体流。

之后我去熟悉了下node.js,本想着自己写个服务器,后来发现node.js虽然简单,但也不是说上来就能写的(倒是上来就能改),所以最后决定看看ProjectRTC的服务器实现。由于这时我已经很了解整个信令的交互过程,所以很快就找到了进行信令转发的代码。然后发现,这个服务器很合适啊,只需要改一点点就可以了。。唉,早看就好了。但是如果没有前面的铺垫估计也不好看。

至此已经对对整个项目了然于胸了,但是也没有时间了/(ㄒoㄒ)/~~,所以最后稍微修改下服务器,让第一个接入的客户端等待,对于第二个接入的客户端,将第一个客户端的id发给它。android端,只需修改几句代码,将接收到的对方id赋值给callerId即可。

运行效果

这里写图片描述

这里写图片描述

修改后的项目源码:http://download.youkuaiyun.com/detail/youmingyu/9711362

总结

这次项目感觉不该用这么长时间,主要是自己思路不清晰就胡乱尝试,不但行不通而且浪费时间,然后觉得写博客确实很有帮助,之前还思路混乱,但是在写的过程中就越发清晰了。
还有一些不足之处以后再弥补:

  • 对添加WebRTC库的编译配置过程不清楚,AndroidRTC的demo配好了。
  • 不清楚VideoTrack和AudioTrack怎么开始播放的,没看到类似play的代码。
  • 时间所限,没有看WebRTC的开发文档,里面应该说的很详细。

参考

Android音视频开发之-WebRTC技术实践 正值金三银四招聘旺季,很多小伙伴都询问我有没有前端方面的面试题,特地整理出来赠送给大家!资料领取方式:点击这里前往获取正值金三银四招聘旺季,很多小伙伴都询问我有没有前端方面的面试题,特地整理出来赠送给大家!资料领取方式:点击这里前往获取资料领取方式:点击这里前往获取。 阅读详情

相关推荐

WebRTC学习之路---Android端与Web端交互

二进制前缀:0b,十六进制前缀:0x,八进制前缀:0。 又多了解了一点javaSE的知识,java内部接口默认就是静态的。 一、Android Studio小坑        为了打通Android和浏览器的互通,安装了4年前用的IDE。。。AS。。。报了些错误,在这里记录下。    &nbs...

cj1561435010的博客 3037

Android端基于WebRTC的音视频通话小demo

版本信息 AndroidStudio :3.5.2 org.webrtc:google-webrtc:1.0.28513 WebRTC简介 WebRTC是什么 WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持...

吓成一坨兔子 7482

安卓基于SRS的Webrtc推拉流

Https必须需要域名 httpx-static 配置 https 代理 基于SRS 配置文件支持 https Android 推拉webrtc流到srs

分享Android应用和系统开发、音视频编码、性能优化相关知识 6094

Android WebRTC 实现1V1实时音视频通信

本课程讲述如何使用OC 实现1V1 Android端实时音视频通信包括如何使用nodejs开发WebSocket信令服务器理解WebRTC媒体的交互流程coturn服务器搭建Android音视频客户端开发

webrtc——web与android,android间通信

初次接触webrtc,尝试web端与android端通信,以及进一步使得android间实现通信 准备:在github上下载webrtc在android端的源码(另需下载node.js服务端源码,在该网站下有引导——https://github.com/pchab/AndroidRTC) 源码:projectRTC——服务端,也可作为web端  需在终端输入  node app.js(

tobeamaster的博客 5247

WebRTC[40]- WebRTC 如何在安卓系统上采集音频数据

目录 前言 正文 步骤一、获取麦克风权限 步骤二、音频采集模块初始化 步骤三、启动音频采集流程 步骤四、音频预处理 结尾 前言 WebRTC 作为一个开源的实时音视频通许方案,经过多年的发展基本上已经支持了所有的常用终端,比如 windows、mac、Android、iOS 等。我们都知道音视频通讯的前提是采集本地的音频和视频数据信息。今天,我们就来了解一下 WebRTC 在安卓端是如何采集音频信号的。 正文 上一篇文章已经介绍了 WebRTC 如何在安卓系统上采集视频数据信号,相信小

liuzhen007的专栏 2898

Android WebRTC简介

Android WebRTC简介 WebRTC简介 WebRTC WebRTC名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。Google于2011年6月3日开源的即时通讯项目,旨在使其成为客户端视...

Charon_Chui的专栏 1万+

在Android端使用WebRTC的入门教程

在receiveCall方法中,我们接收对方的Offer,并设置对方的SessionDescription。在processAnswer方法中,我们接收对方的Answer,并设置对方的SessionDescription。在构造函数中,我们首先初始化PeerConnectionFactory,然后创建VideoCapturer和VideoSource,接着创建VideoTrack和AudioTrack,并将它们添加到本地的MediaStream中。这将初始化WebRTC并准备好在应用程序中使用它。

TjsReact的博客 2115

Android实现WebRTC的android端互连(附带源码)

Android实现WebRTC的android端互连(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 4359

Android实现WebRTC的android端互连 (附完整源码)

Android实现WebRTC的android端互连 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 618

【licode】android client 基于webrtc 的采集推流

webrtc android capture 上一篇 发现视频采集有问题 自己的客户端是2018年、2017年的 主干版本已经废弃。 大神做了修改,但是在我这里会崩溃 本想升级下 ,发现 VideoRender 没了,尝试使用新api,但是信令有问题,所以继续在我的老客户端上使劲。 跑了下老版本webrtc的android 采集例子,今天修改了下,采集ok了,但是绿屏 使用webrtc 做Android视频采集 websocket 信令调试的原因,新版webrtc api 调不通流程 所以考虑 恢复使用了大神工程里自带的老的库 老库使用 render 渲染,新库没了这个类 老库有i420fra

基于Android端WebRTC点对点互连

项目准备 信令服务器代码:https://github.com/matthewYang92/WebRtcServer(代码改自ProjectRTC) 安装Node.js 进入项目根目录,命令行:npm install 命令行:node app.js 打开浏览器输入127.0.0.1:3000,见到WebRtcServer标题,服务器ready 客户端代码:https://github.com/

上海一九四三 3408

Unity中5分钟实现3D高斯泼溅渲染:从原理到实战部署

3D高斯泼溅(3D Gaussian Splatting)是一种新兴的神经渲染技术,它通过显式地使用大量3D高斯椭球来表示场景,革新了传统的体渲染和神经辐射场(NeRF)方法。其核心原理是将这些3D高斯投影到2D屏幕并进行快速光栅化与Alpha混合,从而绕过了耗时的光线步进,实现了极高的渲染效率。这项技术的价值在于,它能够在消费级GPU上达到实时甚至超实时的帧率,同时保持紧凑的数据表达和惊人的视觉细节,极大地降低了高质量3D重建与渲染的门槛。在应用场景上,它正快速渗透到数字孪生、虚拟现实、文化遗产数字化以及

weixin_29474431的博客 271

Android端WebRTC点对点互连

项目准备 信令服务器代码:https://github.com/matthewYang92/WebRtcServer(代码改自ProjectRTC) 安装Node.js 进入项目根目录,命令行:npm install 命令行:node app.js 打开浏览器输入127.0.0.1:3000,见到WebRtcServer标题,服务器ready 客户端代码:https://git...

weixin_30361641的博客 355

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

半波整流是一种利用二极管的单向导通特性,将交流电转换为直流电的基础电路。它通过“切除”交流电的半个周期,仅保留另外半个周期来实现整流。1 开关电源超快学习思路点击跳转1.1开关电源的原理、结构和实物入门篇-超简单解读点击跳转1.2开关电源的EMI输入电路-超简单解读点击跳转倍压整流适用于需要高电压、小电流的特殊场合,通过电容充放电实现电压倍增。

2301_81299416的博客 2924

内网环境下 OpenSSL 与 OpenSSH 安全升级实战指南:从 9.9p2 离线部署到回滚方案

本文详细介绍了内网环境下OpenSSL与OpenSSH的安全升级实战指南,重点涵盖从9.9p2版本离线部署到回滚方案的全流程。通过备份策略、动态库处理、权限修复等关键步骤,确保升级过程安全可靠,特别适合金融、政务等敏感行业的内网服务器安全加固。

weixin_30566063的博客 510

WebRTC 在 Android 端实现一对一通信

WebRTC 在 Android 端实现一对一通信

ProgramNovice的博客 3748

LM Studio 模型加载与转换实战指南:从GGUF格式到本地部署

本文提供了使用LM Studio加载与转换GGUF格式大语言模型的完整实战指南。详细阐述了为何GGUF格式是本地部署的最佳选择,并逐步指导用户如何将非GGUF模型(如Transformers格式)转换为GGUF格式,以及在LM Studio中进行加载、配置GPU卸载等关键优化,最终实现流畅的本地离线对话体验。

weixin_29061425的博客 916

WebRTC入门教程(三) | Android 端如何使用 WebRTC

作者:李超,如遇到相关问题,可以点击这里与作者直接交流。 前言 在学习 WebRTC 的过程中,学习的一个基本步骤是先通过 JS 学习 WebRTC的整体流程,在熟悉了整体流程之后,再学习其它端如何使用 WebRTC 进行互联互通。 我们已经在前面分享了信令服务器的搭建和 STUN/TURN服务器的搭建: rtcdeveloper.com/t/topic/133… rtcdeveloper.c...

weixin_33693070的博客 4720

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2003

PLC的自抗扰控制(ADRC)算法

1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清教授的论文和书籍,这里就不赘述了,下面给出梯形图+SCL代码。 1、跟踪微分器 2、线性控制率 3、博图SCL控制代码 4、ADRC控制算法的所有公式汇总 ......

RXXW_Dor的博客 3852

在 macOS 中编译 webrtc android 端代码

在 macOS 中编译 webrtc android 端代码 文章目录在 macOS 中编译 webrtc android 端代码1. 前提2. 编译环境3. 操作步骤3.1 替换 llvm-build3.2 替换 Jdk3.3 修改 gn 脚本3.4 编译脚本4 结束 1. 前提 已提前在 ubuntu 系统中下载好 webrtc 代码并可完整编译,关于如何在 Ubuntu 内下载 webrtc 代码,此处省略一万字。。。 2. 编译环境 macos: 10.15 Catalina 系统 webrtc:

liuwenchang1234的专栏 3541

2025小红书爬虫还能活?破解x-s签名+动态Cookie,亲测爬1000条笔记零封禁(附逆向全过程)

上周帮美妆行业的朋友爬小红书“口红推荐”笔记,刚发30个请求就被403,抓包一看x-s签名不对;换Cookie继续爬,爬50条又被封——小红书的反爬这两年简直是“地狱模式”:动态Cookie每10分钟过期,x-s签名算法季度更新,连请求头的User-Agent顺序错了都会被拦。。这篇文章不藏私,把逆向x-s签名的全过程、动态Cookie的维护技巧、1000条稳定爬取的实战代码全给你,连我踩过的8个坑都标出来了(最后附代理池配置,IP零封禁的关键)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 7399
上一篇: Android 蓝牙开发基本流程
下一篇: Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
阿拉阿伯
博客等级 码龄11年 301粉丝 146原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值