基于Webrtc的视频通话录制功能-Android实现

news2024/12/23 1:15:45

基于Webrtc的视频通话录制功能-Android实现

webrtc本身并不支持视频通话的录制。 webrtc的sdk只是暴露了视频数据给开发者,而音频数据并没有向外暴露。 因此如果要进行视频通话的录制,需要修改webrtc的sdk,将音频数据暴露出来。 webrtc的下载和编译可参考之前的文章:WebRtc下载和编译

一、修改SDK,引出音频数据

1. 音频采集数据的提取(mic输入,本地声音)

webrtc的音频数据的采集在audio_device_java.jar包中,具体类为WebRtcAudioRecord,其对应源码中的位置为:

src/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java

a) 在该类中添加如下代码:

// tanghongfeng add begin
private static WebRtcAudioRecordCallback mWebRtcAudioRecordCallback;
public static void setWebRtcAudioRecordCallback(WebRtcAudioRecordCallback callback) {
    Logging.d("WebRtcAudioRecord", "Set record callback");
    mWebRtcAudioRecordCallback = callback;
}
public interface WebRtcAudioRecordCallback {
    void onWebRtcAudioRecordInit(int audioSource, int audioFormat,
             int sampleRate, int channels, int bitPerSample, 
             int bufferPerSecond, int bufferSizeInBytes);
    void onWebRtcAudioRecordStart();
    void onWebRtcAudioRecording(ByteBuffer buffer, int bufferSize, 
             boolean microphoneMute);
    void onWebRtcAudioRecordStop();
}
// tanghongfeng add end

b) 在initRecording方法中添加如下代码:

private int initRecording(int sampleRate, int channels) {
    ......
    logMainParameters();
    logMainParametersExtended();
    // tanghongfeng add begin
    if (mWebRtcAudioRecordCallback != null) {
        mWebRtcAudioRecordCallback
             .onWebRtcAudioRecordInit(audioSource, 2, sampleRate, 
                         channels, 16, 100, bufferSizeInBytes);
    }
    // tanghongfeng add end
    return framesPerBuffer;
}

c) 在startRecording方法中添加如下代码:

private boolean startRecording() {
    ......
    try {
        this.audioRecord.startRecording();
        // tanghongfeng add begin
        if (mWebRtcAudioRecordCallback != null) {
            mWebRtcAudioRecordCallback.onWebRtcAudioRecordStart();
        }
        // tanghongfeng add end
    } 
    ......
}

d) 在stopRecording方法中添加如下代码:

private boolean stopRecording() {
    ......
    this.releaseAudioResources();
    // tanghongfeng add begin
    if(mWebRtcAudioRecordCallback != null) {
        mWebRtcAudioRecordCallback.onWebRtcAudioRecordStop();
    }
    // tanghongfeng add end
    return true;
}

e) 在内部类AudioRecordThread的run方法中添加如下代码:

@Override
public void run() {
    ......
    while (keepAlive) {
        int bytesRead = audioRecord.read(byteBuffer, byteBuffer.capacity());
        if (bytesRead == byteBuffer.capacity()) {
            ......
            if (keepAlive) {
                nativeDataIsRecorded(bytesRead, nativeAudioRecord);
                // tanghongfeng add begin
                if (mWebRtcAudioRecordCallback != null) {
                    mWebRtcAudioRecordCallback.onWebRtcAudioRecording(byteBuffer, 
                                                 bytesRead, microphoneMute);
                }
                // tanghongfeng add end
            }
        } else {
            ......
        }
        ......
    }
}

2. 音频网络数据的提取(网络传入,对方声音)

webrtc的音频网络数据的提取在audio_device_java.jar包中,具体类为WebRtcAudioTrack,其对应源码中的位置为:

src/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java

a) 在该类中添加如下代码:

// tanghongfeng add begin
private static WebRtcAudioTrackCallback mWebRtcAudioTrackCallback;;
public static void setWebRtcAudioTrackCallback(WebRtcAudioTrackCallback callback) {
    Logging.d("WebRtcAudioTrack", "Set track callback");
    mWebRtcAudioTrackCallback = callback;
}
public interface WebRtcAudioTrackCallback {
    void onWebRtcAudioTrackInit(int audioFormat, int sampleRate,
                 int channels, int bitPerSample,
                 int bufferPerSecond, int minBufferSizeInBytes);
    void onWebRtcAudioTrackStart();
    void onWebRtcAudioTracking(ByteBuffer byteBuffer, int bytesWritten, 
                 boolean speakerMute);
    void onWebRtcAudioTrackStop();
}
// tanghongfeng add end

b) 在initPlayout方法中添加如下代码:

private boolean initPlayout(int sampleRate, int channels) {
    ......
    logMainParameters();
    logMainParametersExtended();
    // tanghongfeng add begin
    if (mWebRtcAudioTrackCallback != null) {
        mWebRtcAudioTrackCallback.onWebRtcAudioTrackInit(2, sampleRate, channels,
                                    16, 100, minBufferSizeInBytes);
    }
    // tanghongfeng add end
    return true;
}

c) 在startPlayout方法中添加如下代码:

private boolean startPlayout() {
    ......
    try {
        audioTrack.play();
        // tanghongfeng add begin
        if (mWebRtcAudioTrackCallback != null) {
            mWebRtcAudioTrackCallback.onWebRtcAudioTrackStart();
        }
        // tanghongfeng add end
    }
    ......
}

d) 在stopPlayout方法中添加如下代码:

private boolean stopPlayout() {
    ......
    // tanghongfeng add begin
    if (mWebRtcAudioTrackCallback != null) {
          mWebRtcAudioTrackCallback.onWebRtcAudioTrackStop();
    }
    // tanghongfeng add end
    return true;
}

e) 在内部类AudioTrackThread的run方法中添加如下代码:

@Override
public void run() {
    ......
    while (keepAlive) {
        ......
        // tanghongfeng add begin
        else if (mWebRtcAudioTrackCallback != null) {
            mWebRtcAudioTrackCallback
                  .onWebRtcAudioTracking(byteBuffer, bytesWritten, speakerMute);
        }
        // tanghongfeng add end
        byteBuffer.rewind();
    }
    ......
}

3. 编译webrtc,复制audio_device_java.jar包到视频通话的项目的libs中

编译生成的audio_device_java.jar包位于:

src/out/Debug/lib.java/modules/audio_device/audio_device_java.jar

二、使用修改后SDK,实现视频通话录制功能

本demo基于WebRtc的android示例APP。该示例APP的源码路径: src/examples/androidapp 本demo完整的代码在github中: https://github.com/thfhongfeng/PineAppRtc

视频通话录制的主要实现类为MediaRecordController

1. 实现方式:

a) 视频数据采集使用MediaProjection+VirtualDisplay b) 双路音频的混音使用平均算法 c) 使用MediaCodec编码,使用MediaMuxer封装成MP4文件

2. 录制流程:

录制流程.jpg

三、搭建WebRtc服务器,完成端对端的WebRtc功能

1. 服务器搭建

参考之前的文章:搭建WebRtc服务器

2. 修改App的房间服务器地址(请读者使用自己搭建的服务器的地址进行设置,示例中的地址为作者本地搭建的服务器地址,外网是无法访问的):

两种方式: a) 修改App源码中的房间服务器的默认地址为自己搭建的房间服务器的地址,修改文件pine_rtc\src\main\res\values\strings.xml:

<string translatable="false" name="pref_room_server_url_default">http://10.10.29.56:7000</string>

修改文件pine_rtc\src\main\AndroidManifest.xml:

<activity android:name=".org.component.ConnectActivity" 
          android:label="@string/app_name"
          android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="https" android:host="10.10.29.56"/>
        <data android:scheme="http" android:host="10.10.29.56"/>
    </intent-filter>
</activity>

重新编译Demo App b) 不修改源码,启动App后直接在设置中修改房间服务器地址为自己搭建的房间服务器的地址。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV-Python】教程:3-9 轮廓(4)更多函数

OpenCV Python 轮廓 【目标】 凸性缺陷查找点与多边形的关系不同形状的匹配 【代码】 左图中红色点为凸性检测的缺陷点&#xff0c;即凹点 右图为了验证点与多边形关系而做的图&#xff0c;也是官网要求做的练习。 import cv2 import numpy as np img cv2.imread(star.png…

契约锁电子签助力拍卖业务网上签约,保全证据、不可抵赖,成交快

近年&#xff0c;二手车、房产、股权、数字藏品以及法律诉讼资产的拍卖&#xff0c;逐步从线下向线上转型。电子签章技术的应用&#xff0c;解决了委托拍卖合同、竞买合同以及成交确认书等文件线上签署难题&#xff0c;帮助拍卖机构建立全程数字化的“网上拍卖”渠道&#xff0…

Java本地搭建宝塔部署实战springboot智慧物业管理源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套基于若依开发的springboot智慧物业管理系统的源码&#xff0c;系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术架构 技术框架&#xff1a;SpringBoot…

5G工业互联网的“下半场”该拼什么?

据工信部11月21日最新发布的《2022年1-10月份通信业经济运行情况》显示&#xff0c;截止10月末&#xff0c;国内5G基站总数已达到225万个&#xff0c;占全球5G基站数比例超70%。截止今年8月末&#xff0c;国内已提前完成全年建成200万个5G基站的目标。中国在5G网络建设、终端普…

Echarts-实现3D柱状图显示,并单个柱子变色

如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>模拟3D柱状图渐变色柱子</title><scripttype"text/javascript"src"https://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.…

java每一练(3)

java每日一练(3) 单选部分 &#xff1a; 1.以下代码运行输出的是 public class Person{private String name "Person";int age0; }class Child extends Person{public String grade;public static void main(String[] args){Person p new Child();System.out.pri…

JavaWeb之Maven学习

目录Maven 简介仓库的分类Maven 坐标Maven 常用命令Maven 生命周期依赖管理删除Maven 项目导入项目最后Maven 简介 Maven的作用&#xff1a; Maven是专门用于管理和构建Java项目的工具 它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程…

sqli-labs/Less-60

这一关还是一如既往的5次机会 一如既往的是以id作为注入点的 我们还是按照先前的做法第一轮先去获取一下注入类型以及决定下一轮要使用的注入方法 第二轮在进行各种爆破操作 首先输入id1 and 12判断注入类型是否属于数字型 回显如下 属于字符型 然后输入1 回显如下 说明不属于…

看世界杯效应下的中东市场,开发攻略来了

卡塔尔世界杯正如火如荼开展中&#xff0c;作为首次在中东地区举办的世界杯&#xff0c;它吸引了全世界目光的同时&#xff0c;也带来了一大波消费和需求。 先看一则新闻&#xff0c;在11月22日晚&#xff0c;沙特队在卡塔尔世界杯首战上演惊天大逆转&#xff0c;以2比1击败夺…

深入浅出DDD编程

作者 | 刘嘿嘿、离夏、立羽 导读 最近几年&#xff0c;微服务拆分大行其道&#xff0c;在业务越来越复杂的情况下&#xff0c;许多业务纷纷抛弃了传统单体架构&#xff0c;拥抱微服务。但随着微服务的拆分结束&#xff0c;大家又发现了新的问题&#xff0c;比如服务间逻辑复杂&…

计算机毕业设计之java+ssm峰值预警停车场管理系统

项目介绍 随着城市建设与经济的不断发展,城市车辆的数量也不断增涨,为解决停车问题修建停车场。基于经营、安全、管理等多角度的考虑&#xff0c;希望在目前传统的大型车库管理系统中有机地结合车牌识别技术&#xff0c;以求得日后在停车库运营时更安全、管理上更细致、经营中…

SuperMap 云原生常见问题解决办法-keycloak启动异常

有些客户在使用iManager for K8S 云套件的产品的时候&#xff0c;偶尔会遇到机器异常重启的情况&#xff0c;比如说服务器断电&#xff0c;重启后可能会出现云套件启动异常的情况&#xff0c;比如说keycloak启动不了&#xff0c;一直抛出异常导致服务无法正常使用。本篇文章就结…

MongoDB故障转移案例详细操作

MOngoDB故障转移 文章目录MOngoDB故障转移1.数据库提权操作1.1.使用命令查询主库信息1.2.给db02升级权重1.3.修改完成后进行加载配置1.4.主库执行降级操作2.恢复主库权限2.1.先给库权重降低2.2.执行降级命令2.3.恢复成功MongoDB的主从目前是我们在配置副本集的时候设置但是如果…

强化深度学习中使用Dyna-Q算法确定机器人问题中不同规划的学习和策略实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ并且私信~~~ 一、模型、学习、规划简介 1&#xff1a;模型 Agent可以通过模型来预测环境并做出反应&#xff0c;这里所说的模型通常指模拟模型&#xff0c;即在给定一个状态和动作时&#xff0c;通过模型可以对下一状态和奖赏做出预测 …

学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计 汉语言文学设计题材网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

在Postman中使用 FineBI提供的接口获取数据

FineBI 通过各种样式如表格、图表等来呈现数据&#xff0c;进行统计分析。 FineBI 是 B/S 架构的纯 Java 软件。 这些数据表格或图表&#xff0c;用户在开发系统的时候也可以自己编程来实现&#xff0c;FineBI也提供了相应的接口。 在Postman中使用 FineBI提供的接口获取数据…

数据可视化软件使用

一 前言 数据可视化平台是通过三维表示技术来表达复杂的信息&#xff0c;实现海量数据的立体体现。可视化技术借鉴人脑的视觉显示能力&#xff0c;通过挖掘重要数据之间的关系&#xff0c;揭示数据中隐藏的关联和发展趋势&#xff0c;从而提高数据的使用效率。可视化平台使人们…

在这个艰难的环境下,我裸辞了

2022年&#xff0c;疫情期间&#xff0c;工作了22年的我&#xff0c;从软件研发管理的相关工作中&#xff0c;辞职创业&#xff0c;开启我的独立咨询顾问生涯。很多人不解和迷惑&#xff0c;也有朋友关切的询问我的近况&#xff0c;就差用手来摸我的额头以判断我是否发烧了。因…

[附源码]SSM计算机毕业设计江苏人才信息管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

.net----委托和事件

委托和事件委托声明实例化调用将类型安全的函数指针(方法)作为其他方法的参数进行传递&#xff0c;从而实现函数回调方法委托&#xff1a;匿名方法委托多播委托委托&#xff1a;委托的异步调用委托&#xff1a;委托的兼容性事件事件实际上是委托的一种特殊形式&#xff0c;C#使…