播放录制是在观众端录制视频内容存至本地。观众对观看内容非常感兴趣想要将该视频内容留存至本地时便可使用该功能。

一. 可行的方案

在Android端实现播放录制的方法大约有下面三种:

1. 录屏

在Android 5.0 (API Level 21)及以上版本提供了录屏功能,使用系统提供的类MediaProjection与VirtualDisplay可实现在Android端的录制屏幕内容的功能,此处不再赘述。

但此方法亦会录制应用的UI及可能的消息通知等与视频无关的内容,对Android的版本有一定要求。

2. 重封装(Remux)

播放器在播放视频时可获取原始音视频数据,当观众希望录制视频的时候,将原数数据进行一次Remux即成。

但是Remux的数据需要保证第一个视频帧是关键帧。因此播放器内部内部需要缓存已经解码并播放过的音视频数据直到新的关键帧(IDR帧)到来。

但此方案存在若干问题:

额外的内存开销。已经用于解码的音视频数据,其对应内存不可被释放,以备观众录制视频内容、直到新的GOP数据到来,上一个GOP的数据方可被释放。这样就带来了额外的内存开销。

内容多余。此方案必须从关键帧开始做Remux,并不一定是从用户想要录制的内容开始,特别是对于GOP较大的视频,此问题尤为明显。

3. 重编码&封装

此方法是将解码之后的YUV和PCM数据送入编码器,将编码后的数据重新封装为目标视频。

此方案需要重新编码,会占用相当的CPU资源。

我们最终采用了方案3作为初始方案,采用Android手机提供的硬编功能将音视频数据编码,将编码后的数据封装为MP4文件。

二. 踩过的坑

在开发过程中踩过不少坑,下面和大家分享下:

2.1 MediaCodec

MediaCodec是Android提供的关于音视频硬编/硬解功能的核心类,其接口及相应功能在此不在赘述。实现播放录屏功能时使用MediaCodec编码视频,遇到的最坑的问题是:

颜色空间,一般情况下软解视频输出YUV420Planar数据,而Android手机可能只支持YUV420Planar或YUV420SemiPlanar,其区别如下图所示。因此需要根据每个手机的实际情况做出适配。

2.2 MediaMuxer

MediaMuxer是Android于4.3版本引入的用于将编码后的音视频数据封装为MP4的核心类。实现播放录屏功能时最初是选用MediaMuxer将编码之后的音视频数据复用为MP4,然则因为Android系统的碎片化,各厂商根据各自的需求对ROM做了相应修改,导致MediaMuxer的稳定性在各手机表现不太一致,与预期相差较远。

三. 最终的方案

最终的解决方案是使用MediaCodec+FFMpeg,MediaCodec将解码后的音视频数据编码,FFMpeg将编码之后的音视频数据封装为MP4文件。其中视频编码默认使用H.264/AVC的Baseline,音频编码使用AAC-LC。其基本架构图如下所示

播放器将解码后的音视频数据(YUV/PCM)交予录制模块,录制模块有两个缓存队列分别缓存解码后的音视频数据;

录制模块的音视频各有一个编码线程,每个线程持有一个MediaCodec的对象,分别从音视频队列取解码后的数据,然后将编码后的数据放入已编码数据队列。写数据线程会不断从已编码数据队列中拉取数据,然后调用封装模块的接口,将音视频数据封装为MP4;

封装模块调用了FFMpeg提供的接口,将音视频数据写入本地磁盘。其中需要先写入音视频的关键信息例如: SPS/PPS、ADTS等。

四. 结语

按照以上步骤便可实现在Android端的播放录制功能,但是依旧有改进的空间,例如使用MediaCodec做视频编码在少许低端机型依旧存在问题,后续会根据推出更加稳定的版本。

服务于大家,一直是金山云多媒体SDK团队的目标。团队在很用心的开发短视频SDK,欢迎试用!

android播放器录制视频,Android播放器的录制实践相关推荐

  1. YUVPlayer: 基于Android平台的YUV视频原始数据播放器

    基于Android平台的YUV视频原始数据播放器 编译环境 FFmpeg版本: 4.2.2 NDK版本:r17c 运行环境 x86(模拟器) arm64-v8a(64位手机) 功能点 从文件中读取YU ...

  2. 机试题:地图定位、拍照并显示、录制视频并播放

    这两天参加面试,有个公司先出了机试题,然后才能进入下一步,机试题大意是要求实现:地图定位.拍照并显示照片.录制视频并且播放视频三个小功能. 先上我的效果图: 1.地图定位关键代码(ios8后,开启地图 ...

  3. mediaRecorder录制视频与播放

    1.添加权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-p ...

  4. 怎么锁定电脑屏幕_怎么录制视频?在电脑上录制视频的步骤详解

    原标题:怎么录制视频?在电脑上录制视频的步骤详解 作为重要的办公工具之一,电脑可不只是用来发发文件.看看文档,有时候我们还会对它进行录屏.特别是在短视频自媒体行业中,学会.掌握电脑录屏是基础技能,很多 ...

  5. android 直播流服务器,视频-Android上的实时流RTMP / RTSP播放器,无需使用webview(WOWZA服务器)...

    视频-Android上的实时流RTMP / RTSP播放器,无需使用webview(WOWZA服务器) 我正在开发一个Android应用程序,我想在其中发布和播放视频... 我想要的是: 我的应用记录 ...

  6. Android 仿微信长按录制视频并播放的功能

    一.点击按钮进行录制 首先要获取摄像拍照的权限和读取权限 <uses-permission android:name="android.permission.CAMERA" ...

  7. 微信H5同层播放器以及视频自动播放

    iOS之前已经解决了视频播放默认全屏,且浮在页面最顶端的问题 playsinline webkit-playsinline 这样就可以在视频之上进行一些操作,实现诸如弹幕.自定义播放控件等的效果. 但 ...

  8. android 静态图片gif视频轮流播放

    最近做了一个关于广告视频的项目,双屏异显,并且在数千台广告屏上运行这个APP,而且要同步,核心的功能是图片gif视频轮流播放的功能,在此做个总结: 1.静态图片gif视频轮播: 我用的都是原生的插件, ...

  9. HTML5播放器:视频分段播放

    2019独角兽企业重金招聘Python工程师标准>>> 本来想试试能不能越过Vip验证关卡,直接获取到视频资源地址的,但是发现拿到的地址只有几分钟的,或者十几分钟的! 想着这应该是视 ...

  10. EasyPlayer播放H.265视频,播放器快照时间显示的问题优化

    我们的EasyPlayer流媒体播放器可支持H.264与H.265,能支持RTSP.RTMP.HLS.FLV.WebRTC等格式的视频流播放.TSINGSEE的视频平台均集成了EasyPlayer的播 ...

最新文章

  1. 自然语言推理和数据集
  2. 程序员裸辞求夸,众网友上演大型夸夸秀现场:楼主好样的
  3. 狂宴终有尽时,留一份清醒一份醉 比特币现金BCH凸显投资价值
  4. FPGA之道(5)MOS管简介
  5. onpaste事件不生效_从实际开发中来看JavaScript事件循环的使用场景
  6. 2022版全球及中国蓝宝石材料产业容量预测与十四五投资战略研究报告
  7. 【STM32】GPIO功能复用
  8. BufferedReader_字符缓冲输入流
  9. EV3 直接命令 - 第 4 课 用两个驱动轮精确地移动小车
  10. POJ 1011 Sticks
  11. MySQL 大表优化方案(长文)
  12. c语言简单图形库,C语言图形库简单对比及EGE库的安装小手册
  13. Unity给力插件之ShaderForge
  14. chrome浏览器Flash Player版本太低,不能使用该上传功能!
  15. 物联网信号测试软件,物联网开关量信号采集 NPN转WIFI 检测计数器
  16. Android Bitmap关于setPixel设置的值和getPixel获得的值不一样的问题
  17. Android音乐播放器---实现Notification控制音乐播放
  18. 每个公众号都需要一个社区小程序
  19. word 表格不跨行断页
  20. 006基于近似熵、递归量化分析和卷积神经网络的癫痫发作自动检测-2019

热门文章

  1. linux系统开远程桌面,Linux 系统开启远程桌面的方法
  2. windows配置java环境变量
  3. SwitchHosts的安装及软件使用
  4. 天翼校园客户端“中毒”,江苏、广东、湖南成重灾区
  5. 2022年由电子科技到整体科技
  6. 游戏产业链:游戏分发/渠道商
  7. Struts框架命名空间问题答疑
  8. python破解wifi-Python利用字典破解WIFI密码的方法
  9. DSP28335的RS232串口通讯试验
  10. IDM下载器插件 让浏览器不在限速