最近由于项目的需求,开始接触了webrtc这个东西。没想到这东西的门槛还是蛮高的,接下来分享一下我所踩过的坑,希望对以后初次接触这个东西的人有所帮助。

webrtc官网

  第一步当然是看官方主页了(www.webrtc.org), 先把主页的内容大致扫了一遍,大概对这个东西的有了一点点认识,接下来就是按照development页面的步骤开始了。按照官方的说法安装依赖的tools,Java环境 etc...这中间当然包括了FQ的必要步骤

代码下载:

  当你配置完环境后,要运行命令gclient sync的时候,发现等了好久,依然是keep working的状态,有点着急了。随后翻看中文bbs(http://chinawebrtc.org/),发现我错了,原来代码有十几个G,代码大小取决于你下载的对应平台代码。事实上我在下载了24个小时之后就放弃了在官网下载的想法。 在中文论坛中发现有好心人已经在网盘上面分享不同平台的代码了,用迅雷不到3个小时就搞定了代码的下载。

代码编译:

  接下来就准备编译的工作了。然而我发现编译依然是那么的麻烦,因为我是下载的别人的源码,然而webrtc使用了自己的编译系统ninja,编译系统需要的.ninja 文件(其实对应于makefile文件)都是依赖于代码下载的本地环境进行了设定。后来终究逃不过gclient sync 这个步骤,不过还好, 不到1小时这个过程顺利结束,本地的编译脚本也正常了。按照官方的说明执行ninja -c out/Debug 几次都不是很顺利,找不到具体的原因,感觉还是代码的问题。后来在github上面发现别人写的编译脚本(https://github.com/pristineio/webrtc-build-scripts),抱着尝试的态度我先把脚本down下来,然后把自己的代码拷贝到了目录webrtc-build-scripts/android/ 下面,最终的代码目录是webrtc-build-scripts/android/webrtc/src ,接下来按照webrtc-build-scripts的readme步骤进行了,这个过程就很顺利了,编译结束之后,会在对面目标平台目录下面生成相应的libjingle_peerconnection.so 和libjingle_peerconnection.jar。

静态库:

  arm平台的动态库是编译好了,可是为了需求,需要想办法做一个静态库出来。查了许久没有发现编译静态库的方法。于是只能自己动手了,通过分析libjingle_peerconnection_so.ninjia 文件,发现其实这个动态库仅是对其它模块编出来的静态库的简单合并。我想采用同样的思路写一个脚本把编译出来的所有子模块的静态库抽取出来,然后合并成一个静态库(当然之前对静态库的理解仅限于简单的目标.o文件的合并)。当我试图用这个方法写的时候发现不行,当把静态库抽取出来的时候这个静态库就不能用了,感觉像是和目标文件的位置绑定了。后来经过各种尝试成功的编译出了安卓平台的静态库,思路大概如下,使用ar -M 这个指令对静态库进行合并。具体的mri脚本我已放在了github上面(https://github.com/xiaopeifeng/apprtc/tree/master/webrtc_static_library_build_script).

  首先将echomri.sh脚本放在webrtc/src/Debug目录并执行,结束之后会生成一个libjingle_peerconnection.mri脚本文件

  然后执行ar -M < libjingle_peerconnection.mri

  最终会在你的目录里看到生成的libjingle_peerconnection.a静态库文件

apprtc安卓工程:

  由于之前没有接触过安卓开发, 所以建立安卓工程还是花费了点时间, 其实过程蛮简单的, 将目录example/androidapp目录下的代码直接导入eclipse(公司主用), 将websocket的jar包, libjingle_peerconnection.jar和armebi的libjingle_peerconnection.so放在libs目录即可. 我已做成了可用的工程放在(https://github.com/xiaopeifeng/apprtc.git), 欢迎下载使用.

apprtc代码修改:

  虽然这份代码可用, 并且demo可以运行,但是信令服务器在墙之外, 所有有必要做出自己的服务器, 对这份官方提供的demo代码通读之后, 按照webrtc peerconnection层的运行流程, 做了自己的服务器, 并且现在简单可以运行了. 之后稳定了再公开吧.

  webrtc的路还有很长, 未知的坑还有很多, 慢慢踩, 慢慢分享.

webrtc初识的更多相关文章

  1. 1.2、初识WebRTC

    文章导读:本节内容,如标题所讲,“初识webrtc”.读完之后,我需要你能清楚三个问题:第一.真正的搞明白实时音视频在生产环境中的真实应用以及前景分析:第二.开发一个符合商业标准的实时音视频应用需要解 ...

  2. WebRTC入门学习之初识WebRTC (转)

    一.WebRTC基本架构 图一  WebRTC总体架构,摘自百度百科 先说说WebRTC大致的实现思路:我们创建的web app,然后在app中调用W3C提供的JS API,JS API 会调用浏览器 ...

  3. webRTC脱坑笔记(一)— 初识webRTC

    webRTC概述 WebRTC--- `Web browsers with Real-Time Communications (RTC)` WebRTC是一个开源项目,可以在`Web`和本机应用程序中 ...

  4. 1.3、WebRTC架构

    文章导读:本文的讲解的是webrtc系统架构,每个人都要Get到这些知识:第一.了解webrtc架构分层:第二.对每层技术有一个清晰的认知.学完本节内容可以为我们后面学习核心API起到至关重要的作用, ...

  5. 1.1、webrtc的历史和现状

    1.1.webrtc的历史和现状 本书目录 温馨提示:本书的内容,将按照顺序一一展开,上篇文章阐述本书的诞生的原因,推荐阅读方式等. 如果你还没有阅读上一篇文章(必读前言—— 作者的独白),我建议返回 ...

  6. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  7. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  8. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  9. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

随机推荐

  1. node04-buffer

    目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...

  2. node在centos下的安装

    CentOS 下安装 Node.js 1.下载源码,你需要在https://nodejs.org/en/download/下载最新的Nodejs版本,本文以v4.6.2为例: cd /usr/loca ...

  3. byte数组和File,InputStream互转

    1.将File.FileInputStream 转换为byte数组: File file = new File("file.txt"); InputStream input = n ...

  4. Spring事务管理

    Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...

  5. Linux常用命令学习4---(挂载命令mount umount、用户登陆查看和用户交互命令 w who last lastlog)

    紧接着上一篇Linux的命令行的学习:Linux学习3---(文件的压缩和解压缩命令zip unzip tar.关机和重启命令shutdown reboot……) 1.挂载命令     简介      ...

  6. TextSwitcher 简单用例

    TextSwitcher 字面理解是文字交换器,是ViewSwitcher的子类,从ViewSwitcher来看,是View交换器,TextSwitcher继承自ViewSwitcher,显然是交换T ...

  7. Spring泛型依赖注入

    1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层   package ...

  8. iOS ---不一样的NSLog打印(精准打印)

    在iOS开发过程中,调试是很重要的过程,而除了各种断点调试(普通断点.条件断点.全局断点)之外,似乎NSLog是我们调试最常用的方法,当然,也是最简单朴素的寻debug方法. 在项目中,我们常使用的N ...

  9. string类里find的用法

    #include<bits/stdc++.h> using namespace std; typedef long long ll; //int INF=(1<<31)-1; ...

  10. codeforces#271 (Div. 2)预处理

    B. Worms time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...