使用JavaCV(ffmpeg)录制视频

JavaCV是对各种常用计算机视觉库的封装后的一组jar包,其中封装了ffmpeg、OpenCV、libdc1394、OpenKinect、videoInput和ARToolKitPlus等计算机视觉编程人员常用库的接口,可以通过其中的utility类方便的在包括Android在内的Java平台上调用这些接口。其中使用最多的应该就是ffmpeg了。

起初Javacv是googlecode下面的一个项目,后续迁移到了github,并且包名也由com.googlecode.javacv改为org.bytedeco.javacv,网上的demo主要有两个:

https://github.com/peirenlei/FFmpegRecorder

https://github.com/CrazyOrr/FFmpegRecorder

我是参考的上面那个,但是使用的是最新的版本1.3.1 。

集成过程中遇到很多问题,弄了一个多星期,在此就记录一下。

其中,javacpp.jar 和 javacv.jar是必须的两个包,然后需要什么功能就添加额外的包。例如我需要用到ffmpeg进行视频录制,则需要添加ffmpeg.jar和ffmpeg-android-arm.jar(打包的arm平台so库)。这里很方便的地方是,so库文件都放在了jar文件里面,所以在集成的时候很简洁明了。

把需要的jar包拷贝到项目的libs目录下就可以直接使用了,

下面就说一下遇到的坑:

在Android M平台,会有异常java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil

这个问题对应的issue:

https://github.com/bytedeco/javacv/issues/245

https://github.com/bytedeco/javacv/issues/579

我的解决方案是在这个帖子里找到的,但是遇到这个问题的人太多,导致这个问题的原因也比较多,例如版本、平台等。而我遇到的这个情况是,在Android M以下版本都是正常的,所以不会是javacv的版本和打包的问题。

最终是通过ReLinker解决的,这是作者的说明:https://github.com/bytedeco/javacpp-presets/wiki/The-UnsatisfiedLinkError-X-File-%28a-real-experience%29

这是意料之外的,之前从未想过说System.loadLibrary("")会不可靠,但是仅仅替换为ReLinker.recursively().loadLibrary(),问题就迎刃而解。

录制时的参数设置

初始化Frame的参数:

private int frameDepth = Frame.DEPTH_UBYTE; //DEPTH_UBYTE=8

private int frameChannels = 2;

FFmpegFrameRecorder支持很多格式的录制,所以在进行录制时需要指定数据的格式,这些格式定义在org.bytedeco.javacpp.avutil.AV_PIX_FMT_XXX,如果是相机预览回调的YUV格式,则只需要用默认的。如果是RGBA的则需要指定为mVideoRecorder.record(mFrameData, AV_PIX_FMT_RGBA);

录制时需要注意视频预览尺寸与视频录制尺寸混淆,特别是相机预览的宽高的颠倒问题。

javacv库比较大,所以尽量不用gradle的方式集成

录制比较耗时

录制540*960的视频需要60ms左右,这个性能已经不太能接受,所以尽量使用独立的线程进行录制。如果后续发现优化方法再更新,也欢迎留言补充!

CodeBlog是我做的一个编程技术学习客户端,集成了很多技术网站上的博客,应用宝详情页

android javacv 录像,使用JavaCV(ffmpeg)录制视频相关推荐

  1. I.MX6 FFmpeg 录制视频

    /************************************************************************** I.MX6 FFmpeg 录制视频* 说明:* ...

  2. JavaCV/FFmpeg录制视频并添加多重滤镜

    JavaCV录制视频时常遇到添加FFmpeg音视频滤镜的需求,FFmpeg内置很多常用的滤镜,如果添加多个滤镜的时候代码处理相对单个要复杂一点,使用滤镜的时候需要注意像素格式的转换,FFmpeg处理的 ...

  3. ffmpeg录制视频时添加时间水印

    IPcamera录制视频,经常用到时间戳水印.ffmpeg avfilter模块,可以实现水印的添加 设置filter const char *filters_descr = "drawte ...

  4. FFMPEG录制视频

    安装 ➜ sudo apt-get install yasm libx264-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev li ...

  5. Android自定义view之仿微信录制视频按钮

    本文章只写了个类似微信的录制视频的按钮,效果图如下:            一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实现 ...

  6. Android 调用系统相机拍照和录制视频,保存照片和视频

    1.申请权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ...

  7. android 拍照 录视频教程,手机如何录制视频,详细录制教程分享给大家

    很多人不知道手机上自带的屏幕录制功能怎么用,其实很简单,今天小编就来分享一下,到底手机上自带的屏幕录制功能怎么用,以iPhone和安卓这两种类型的手机为例,有需要的可以试试. 1.iphone录屏 很 ...

  8. android yuv加水印_Android Camera录制视频添加水印

    通常用Camera 采集视频 得到预览数据,使用mediaCodec获取视频数据,用mediaMuxer进行音视频的混流, 如果想要添加水印很简单: 1.拿到相机预览的帧数据 2.将帧数据转为Bitm ...

  9. android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

    前言 上次我写了一遍文章<Android 关于美颜/滤镜 从OpenGl录制视频的一种方案>,里面利用ImageReader来从获取Surface上获取数据,但是经过@熊皮皮的提醒,我发现 ...

最新文章

  1. 《数学之美》第12章 有限状态机—地图与本地搜索的核心技术
  2. httpurlconnect设置中文参数_CNC数控机床三菱系统参数的设置及报警解除
  3. 用户输入与while循环
  4. 网络名称空间 实例研究 veth处于不同网络的路由问题
  5. Equinix公司在巴西圣保罗开通了一个数据中心
  6. boost::coroutine模块实现不对称链的测试程序
  7. Smarty foreach
  8. JavaSE各阶段练习题----Map
  9. Linux crontab定时执行任务
  10. css 如何让背景图片拉伸填充避免重复显示
  11. suse 10 下mysql安装
  12. OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
  13. 汇编学习--7.12--总结
  14. linux内核安全模块,对Linux内核的修改 - Linux 安全模块(LSM)简介_Linux安全_Linux公社-Linux系统门户网站...
  15. 生活娱乐 WIFI机器人(某机器发烧友自己动手做一台)
  16. Java中IO演练之银行账号校验
  17. 2019面试题:谈谈你的IT职业发展路径规划
  18. CH582 BLE 5.0 使用 LE Coded 广播和连接
  19. 侍魂微信新服务器2019,侍魂胧月传说手游2019年5月14日微信问答试炼答案
  20. 连续型随机变量及概率密度

热门文章

  1. 约瑟夫问题用循环链表解决
  2. 手绘 | 零基础学画古装美女 2
  3. 感谢您关注梦想天空博客!为我投上您宝贵的一票!
  4. 交易员带你看行情|最新铁矿石基本面分析
  5. Android HttpClient访问https接口
  6. 网站网页打开慢是什么原因呢
  7. 2、shell入门命令练习及文本处理三剑客
  8. g3电容屏失灵,电击疗法
  9. 图片放大后变得模糊怎么办?用嗨格式图片无损放大器
  10. 容斥原理·Gym101350G·Snake Rana