前言

该文章面向对WebRTC有一定基础的码农,如果完全没了解过WebRTC的朋友,可以点赞并私信我进行一对一辅导哦。

WebRTC-Android SDK自带的实现方式

其实WebRTC已经提供了一个org.webrtc.VideoFileRenderer.java的渲染器,专门用于把画面数据存储到本地文件,该渲染器与SurfaceViewRenderer.java一样实现了VideoSink接口。

通过VideoTrack.addSink(VideoSink sink)方法把渲染器添加到画面轨道中,即开始录制画面。
通过VideoTrack.removeSink(VideoSink sink)方法可把渲染器从画面轨道中移除,即停止录制画面。

mStartRecordBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 开始录制String filePath = getExternalFilesDir(null).getAbsolutePath() + File.separator + System.currentTimeMillis() + ".y4m";try {mVideoFileRenderer = new VideoFileRenderer(filePath, 480, 640, mEglContext);} catch (IOException e) {e.printStackTrace();mVideoFileRenderer = null;return;}mVideoTrack.addSink(mVideoFileRenderer);}
});mStopRecordBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 停止录制if (mVideoFileRenderer != null) {mVideoTrack.removeSink(mVideoFileRenderer);mVideoFileRenderer.release();mVideoFileRenderer = null;}}
});
但这种方式有2个重大的缺陷:
  1. 只能录制画面,没有实现声音的录制
  2. 录制的画面是YUV裸流,每一帧都是完整帧,所以会导致文件非常大(10几秒的视频就可以超过上百MB)

flutter-webrtc的实现方式

WebRTC-Android SDK自带的实现方式因为有两个重大的缺陷,导致正常的业务基本用不上这种实现方式。
但万幸的是flutter-webrtc项目早已看透了这一切,然后大喊一声我自己来,然后com.cloudwebrtc.webrtc.record.VideoFileRenderer.java这个类就出来了。

跟WebRTC-Android SDK的VideoFileRenderer一样,该渲染器也实现了VideoSink接口,并且额外实现了SamplesReadyCallback接口,实现VideoSink接口是为了获取画面数据,SamplesReadyCallback则是为了获取音频数据。

废话不多,直接上代码

mInitPeerConnectionFactoryBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 初始化PeerConnectionFactory......mPeerConnectionFactory = new PeerConnectionFactory.Builder().......setAudioDeviceModule(JavaAudioDeviceModule.builder(context).setSamplesReadyCallback(new JavaAudioDeviceModule.SamplesReadyCallback() {@Overridepublic void onWebRtcAudioRecordSamplesReady(JavaAudioDeviceModule.AudioSamples audioSamples) {if (mVideoFileRenderer != null) {// 把音频数据传给VideoFileRenderermVideoFileRenderer.onWebRtcAudioRecordSamplesReady(audioSamples);}}}).......createAudioDeviceModule());......}
});mStartRecordBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 开始录制String filePath = getExternalFilesDir(null).getAbsolutePath() + File.separator + System.currentTimeMillis() + ".mp4";try {mVideoFileRenderer = new VideoFileRenderer(filePath, mEglContext, true);} catch (IOException e) {e.printStackTrace();mVideoFileRenderer = null;return;}mVideoTrack.addSink(mVideoFileRenderer);}
});mStopRecordBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 停止录制if (mVideoFileRenderer != null) {mVideoTrack.removeSink(mVideoFileRenderer);mVideoFileRenderer.release();mVideoFileRenderer = null;}}
});

至此,我们就可以边直播边录像了!而且录制出来的是mp4文件,视频经过了压缩,文件大小就是正常的mp4文件大小了。

但是,flutter-webrtc的VideoFileRenderer还是有点小问题,就是对于音频的时间计算有点问题,里面直接固定写死音频的采样率是48000Hz,所以我们还需要对VideoFileRenderer进行一点小修改:

@Override
public void onWebRtcAudioRecordSamplesReady(JavaAudioDeviceModule.AudioSamples audioSamples) {if (!isRunning)return;audioThreadHandler.post(() -> {......if (bufferIndex >= 0) {......
//            presTime += data.length * 125 / 12; // 1000000 microseconds / 48000hz / 2 bytespresTime += data.length * (1_000_000 / audioSamples.getSampleRate() / 2); //16位最后那个数字是2,8位是1}drainAudio();});
}

完美结束~

WebRTC-Android边直播边录像相关推荐

  1. 音视频开发-音视频面试必问的直播延迟分析丨FFmpeg|SRS流媒体服务器|webrtc|Android NDK开发|HTTP-FLV|RTSP

    音视频面试必问的直播延迟分析 1.直播延迟500ms是极限吗,加上WebRTC能做到多少 2.推流的延迟分析 3.流媒体服务器延迟分析 4.拉流的延迟分析 视频讲解如下,点击观看: 音视频开发-音视频 ...

  2. 基于WebRTC的互动直播实践

    互动直播已经逐渐成为直播的主要形式.映客直播资深音视频工程师叶峰峰在LiveVideoStackCon 2018大会的演讲中详细介绍了INKE自研连麦整体设计思路.如何基于WebRTC搭建互动直播SD ...

  3. 节选—Android 视频直播 ( 从快播到直播,从高清到无码 )十年视频开发项目

    本文转载自Android 视频直播 ( 从快播到直播,从高清到无码 )十年视频开发项目,截取其中技术概念比较相关的部分,并做了重新的排版. 视频和直播的准备: android-java层:camera ...

  4. Android手机直播(三)声音采集

    一.文章说明 开始写文章了,才知道写文章真心耗费心力,希望自己尽量做到快速更新,也希望这些文章真心能帮助到开发者们. 这篇文章主要讲述Android声音采集相关的知识,首先介绍声音的基础知识,然后介绍 ...

  5. 开源直播推流sdk_基于WebRTC的互动直播实践

    互动直播已经逐渐成为直播的主要形式.映客直播资深音视频工程师叶峰峰在LiveVideoStackCon 2018大会的演讲中详细介绍了INKE自研连麦整体设计思路.如何基于WebRTC搭建互动直播SD ...

  6. Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明

    折腾了好多天,终于将webrtc Android平台的demo编译出来了,发现即使完全按照webrtc官网的编译指南,还是会碰到各种问题.而网上又没有更全面的说明,最后是通过查看webrtc 批处理脚 ...

  7. android动画送礼物,Android仿直播类app赠送礼物功能

    直播界面 实现的是播放本地的视频文件: /** * 直播界面,用于对接直播功能 */ public class LiveFrag extends Fragment { private ImageVie ...

  8. android4.4 hls,Android VideoView直播电视流(HLS)

    我试图开发电视流(HLS)的应用程序.使用下面的代码我测试了2.3.3,3.0和4.0.1版Android设备上的流,但遇到了几个问题. 在Android 2.3.3上,播放时间大于1分钟,然后停止播 ...

  9. LiveNVR监控流媒体Onvif/RTSP功能支持海康摄像头通过海康SDK的方式接入直播观看录像回看预置位操作

    LiveNVR功能支持海康摄像头通过海康SDK的方式接入直播观看录像回看预置位操作 1.流媒体服务说明 2.支持海康SDK接入 3.视频广场查看播放 4.预置位接口 4.RTSP/HLS/FLV/RT ...

最新文章

  1. Open3d学习计划—高级篇 5(RGBD融合)
  2. 人工智能落地之路:从概念验证到产品
  3. 多维分析中的 UV 与 PV
  4. 1分钟10万字大法:量子波动速读、蒙眼翻书穿针,这是席卷15省的最新智商税...
  5. 2.1 0/1分类问题-机器学习笔记-斯坦福吴恩达教授
  6. C++使用Merge Sort排序计数反转的实现算法(附完整源码)
  7. 我们是否能信任算法?不信任又能怎么办?
  8. HTML+CSS+JS实现 ❤️年年有鱼祝福背景特效❤️
  9. linux 自定义键盘布局,Ubuntu自定义键位xmodmap
  10. 计算机辅助初中数学教学,计算机辅助数学教学的优势
  11. vue 动态的修改样式
  12. win10家庭版与专业版有什么区别?
  13. LiveReload拓展配合Webpack实现网页自动刷新
  14. 大数据培训(第三季)——Linux基础-徐培成-专题视频课程
  15. 使用遇到的问题_喷淋塔使用过程中遇到的问题以及解决方法
  16. 小学生python编程写游戏_小学生C++趣味编程上下全2册+Python少儿趣味编程适合6-12岁儿童编程教程中小学生计算机程序设计创意零基础游戏编程书籍DK...
  17. pcf85263 linux驱动源码,PCF85263AT/AJ
  18. 论文页眉设置 奇偶页页眉均为章序及章标题 论文按章节设置页眉
  19. C语言程序与设计:篮球游戏
  20. 技术分享 | 如何让无人机实现室内自主搜寻?

热门文章

  1. XSP12 USB PD受电端快充协议芯片
  2. PAT乙级 1008 数组元素循环右移问题
  3. android 猜歌游戏报告,Android第二十五期 - 猜歌小游戏
  4. 这很战斗民族!俄机器人主播连胡子都不刮?
  5. android高德地图上加自定义菜单,高德地图Android室内地图如何自定义覆盖物
  6. c99编译报错改用gnu99
  7. 干货来了丨四大板块构建纵深防御体系,保障工业网络安全
  8. 第一次自己写脚本纪念一下(查看同一网段主机见间能否ping通)
  9. Bezier(贝塞尔)曲线小总结
  10. centos7 docker安装gitlib