Giter Site home page Giter Site logo

mediautils's Introduction

MediaUtils

A demo of record audio and video about Android

一个在 Android 上实现录像和录音功能的小例子。

GitHub 地址:https://github.com/Werb/MediaUtils

download 也可直接点击下载体验

  • Android 的 MediaRecorder 相信用过的同学一定踩过很多坑
  • 之前写的代码很乱,现在重构了一下,可以直接放到自己的项目中用
  • 本例子将 MediaRecorder 进行了重构,通过 MediaUtils 对外暴露几个必需的方法来实现录像和录音功能
  • 录制视频界面参考新版微信小视频,还原了微信的动画效果
  • 支持 Android 7.0
  • 通过线程及 Exception 等手段避免了常见的 start failed , stop failed 等问题
  • 重绘了录制视频和录音时的两个自定义view,可在原本基础上进行二次开发
  • 提供了视频截图方法,支持双击放大,支持自动对焦
  • 视频录制暂时使用 SurfaceView + Camera , 后续会升级为 TextureView + Camera2
  • 简单的加了一下摄像头切换的操作,具体请看MediaUtils.java/switchCamera()

效果图

screenshot

screenshot

核心类

MediaUtils

  • 重构后对外暴露只有8行代码,可结合实际情况使用
      // 初始化
      MediaUtils mediaUtils = new MediaUtils(this);
      mediaUtils.setRecorderType(MediaUtils.MEDIA_VIDEO);
      mediaUtils.setTargetDir(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES));
      mediaUtils.setTargetName(UUID.randomUUID() + ".mp4");
      mediaUtils.setSurfaceView(surfaceView);
      // 开始录制
      mediaUtils.record()
      // 结束录制 save or unSave
      mediaUtils.stopRecordUnSave();
      mediaUtils.stopRecordSave();

CameraHelper

  • 在 Android 中录制视频时显示的 Size 和实际拍照的 Size 是由 Camera 所决定的,最好的方法是计算出可支持的 PreviewSize 和 VideoSize 计算出一个合适的size,同时根据自己视频的用途,选择合理的 Size
  • CameraHelper 参考自 GoogleCameraSample 帮助你计算出合适的 Size

CamcorderProfile

这是一个困扰我好久的地方,一直在想录制视频的时候,如何保存清晰度的情况下,还能控制文件的大小,终于找到了一种可行的办法

  • 分辨率越大视频大小越大,比特率越大视频越清晰
  • 清晰度由比特率决定,视频尺寸和像素量由分辨率决定
  • 比特率越高越清晰(前提是分辨率保持不变),分辨率越大视频尺寸越大
  • CamcorderProfile 是 Android 提供的一个内置的视频参数配置类
  • videoFrameWidth 录制视频分辨率的宽
  • videoFrameHeight 录制视频分辨率的高
  • videoBitRate 这个就是比特率,决定了视频的清晰度
  • 将分辨率和比特率结合自己的需求,进行有效的控制,可以的到自己想要的效果
  • 本 demo 中,录制1080P的视频,大小在5M左右,还可以再小
  • 最后 videoFrameRate 帧率,这个一般是摄像头会自动调节,所以设置了恒定的有的也不起作用
  • 部分机型出现不适配的地方,请及时提 issue 联系我

自定义View

  • 仿造新版微信拍摄视频的界面,通过 Paint,RectF,Canvas 绘制
  • 突然喜欢上了在 Android 画动效,开启 dribbble 抄动效模式

好了,知识虽小但五脏俱全

欢迎使用我自己开源的一个 Android 图片选择器

项目中关于 Android M的权限检查用到了,我的另外一个库

很高兴你看到这里

有时候啊 你总是在追赶前面的人

总是抱怨自己为什么不能再努力一点

累了你可以停下来 看看原来的自己

其实你已经很了不起了。

我是 wanbo 。

mediautils's People

Contributors

werbhelius avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mediautils's Issues

小米4无法录制视频(权限都已给)

09-29 15:33:37.464 6471-6471/? I/art: Late-enabling -Xcheck:jni
09-29 15:33:37.524 6471-6471/com.werb.mediautilsdemo W/System: ClassLoader referenced unknown path: /data/app/com.werb.mediautilsdemo-1/lib/arm
09-29 15:33:37.551 6471-6471/com.werb.mediautilsdemo W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
09-29 15:33:37.577 6471-6471/com.werb.mediautilsdemo V/BoostFramework: mAcquireFunc method = public int com.qualcomm.qti.Performance.perfLockAcquire(int,int[])
09-29 15:33:37.577 6471-6471/com.werb.mediautilsdemo V/BoostFramework: mReleaseFunc method = public int com.qualcomm.qti.Performance.perfLockRelease()
09-29 15:33:37.578 6471-6471/com.werb.mediautilsdemo V/BoostFramework: mAcquireTouchFunc method = public int com.qualcomm.qti.Performance.perfLockAcquireTouch(android.view.MotionEvent,android.util.DisplayMetrics,int,int[])
09-29 15:33:37.578 6471-6471/com.werb.mediautilsdemo V/BoostFramework: mIOPStart method = public int com.qualcomm.qti.Performance.perfIOPrefetchStart(int,java.lang.String)
09-29 15:33:37.578 6471-6471/com.werb.mediautilsdemo V/BoostFramework: mIOPStop method = public int com.qualcomm.qti.Performance.perfIOPrefetchStop()
09-29 15:33:37.580 6471-6471/com.werb.mediautilsdemo V/BoostFramework: BoostFramework() : mPerf = com.qualcomm.qti.Performance@2e36d7e
09-29 15:33:37.580 6471-6471/com.werb.mediautilsdemo V/BoostFramework: BoostFramework() : mPerf = com.qualcomm.qti.Performance@3a632df
09-29 15:33:37.620 6471-6499/com.werb.mediautilsdemo D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
09-29 15:33:37.625 6471-6471/com.werb.mediautilsdemo D/ActivityThreadInjector: clearCachedDrawables.
09-29 15:33:37.662 6471-6499/com.werb.mediautilsdemo I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
OpenGL ES Shader Compiler Version: E031.29.00.00
Build Date: 11/17/16 Thu
Local Branch:
Remote Branch: refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013
Local Patches: NONE
Reconstruct Branch: NOTHING
09-29 15:33:37.664 6471-6499/com.werb.mediautilsdemo I/OpenGLRenderer: Initialized EGL, version 1.4

视频录制

之前所说的问题已经解决了,是我忘记动态添加权限导致的,以为是Android6.0的系统,所以没有动态添加对应的权限,从而导致拍照崩溃

无法录制

07-10 21:29:42.082 2325-2325/com.werb.mediautilsdemo W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
07-10 21:29:42.340 2325-2325/com.werb.mediautilsdemo E/HAL: load: id=gralloc != hmi->id=gralloc
07-10 21:29:42.399 2325-2533/com.werb.mediautilsdemo E/HAL: load: id=gralloc != hmi->id=gralloc
07-10 21:29:42.399 2325-2533/com.werb.mediautilsdemo I/OpenGLRenderer: Initialized EGL, version 1.4
07-10 21:29:42.405 2325-2533/com.werb.mediautilsdemo W/OpenGLRenderer: load: so=/system/lib64/libhwuibp.so
dlopen failed: library "/system/lib64/libhwuibp.so" not found
07-10 21:29:42.405 2325-2533/com.werb.mediautilsdemo W/OpenGLRenderer: Initialize Binary Program Cache: Load Failed
07-10 21:29:42.406 2325-2533/com.werb.mediautilsdemo E/HAL: load: id=gralloc != hmi->id=gralloc
07-10 21:29:42.465 2325-2325/com.werb.mediautilsdemo W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
07-10 21:29:44.044 2325-2325/com.werb.mediautilsdemo E/Camera: Camera new cameraInitNormal:0
07-10 21:29:52.605 2325-2325/com.werb.mediautilsdemo I/HwMediaPermWrapper: confirmCameraPermission, blocked:false

荣耀5X手机,点录视频的按钮没有反应,然后使用其他的点击事件,就会崩

错误日志如下:

Exception dispatching input event.
Exception in MessageQueue callback: handleReceiveCallback
java.lang.RuntimeException: getParameters failed (empty parameters)
at android.hardware.Camera.native_getParameters(Native Method)
at android.hardware.Camera.getParameters(Camera.java:2124)
at com.kanq.camera.MediaUtils.setZoom(MediaUtils.java:329)
at com.kanq.camera.MediaUtils.access$1(MediaUtils.java:327)
at com.kanq.camera.MediaUtils$ZoomGestureListener.onDoubleTap(MediaUtils.java:317)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:523)
at com.kanq.camera.MediaUtils$1.onTouch(MediaUtils.java:85)
at android.view.View.dispatchTouchEvent(View.java:8548)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2390)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1734)
at android.app.Activity.dispatchTouchEvent(Activity.java:2838)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2351)

当录制好视频按home再进入的显示是怎么保留播放界面的呢

在也可直接点击下载体验的demo.apk中,视频录制完在循环播放界面时,按home键进入后台,再进入应用。会先在MainActivity闪烁一次,再显示视频播放界面,有办法让MainActivity不显示吗?另外引用你的库去执行上述操作会出现闪退,提示的是
ava.lang.RuntimeException: getParameters failed (empty parameters)
at android.hardware.Camera.native_getParameters(Native Method)
at android.hardware.Camera.getParameters(Camera.java:1890)
at com.cjt2325.cameralibrary.JCameraView.startRecord(JCameraView.java:464)
at com.cjt2325.cameralibrary.JCameraView.access$900(JCameraView.java:33)
at com.cjt2325.cameralibrary.JCameraView$1.record(JCameraView.java:145)
at com.cjt2325.cameralibrary.CaptureButton$RecordRunnable.run(CaptureButton.java:349)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

camera.unlock

i solove this bug。
File file =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
if (!file.exists()){
file.mkdir();
}
小米没有这个movies文件夹你们使用这个框架钱创建一个文件夹就行了

视频录制

小米4录制视频,第一次长按没反应,进度条也不走;第二次就直接奔溃,导致系统的拍照都没用了,只能重启手机,这个问题非常严重,希望能够得到修复

vivo录制视频时拉伸?

设置的video 720*1280 但是点击录制的时候surfview就拉伸了,请问你大概猜到什么原因嘛

解决切换前置系统奔溃,报setParameters错误

在这里加判断试试:
if (focusModes != null) {

                for (String mode : focusModes) {

                    if (mode.contains("continuous-video")) {

                        parameters.setFocusMode("continuous-video");
                    }
                }
            }

mCamera.setParameters(parameters);
报错原因:需要验证,相机是否支持聚焦模式。

修改分辨率之后抛异常

           // 这里是重点,分辨率和比特率
            // 分辨率越大视频大小越大,比特率越大视频越清晰
            // 清晰度由比特率决定,视频尺寸和像素量由分辨率决定
            // 比特率越高越清晰(前提是分辨率保持不变),分辨率越大视频尺寸越大。
            profile.videoFrameWidth = 720;          //修改了这里
            profile.videoFrameHeight = 1080;       //修改了这里
            // 这样设置 1080p的视频 大小在5M , 可根据自己需求调节
            profile.videoBitRate = 2 * optimalSize.width * optimalSize.height;

异常:
05-16 18:00:36.996 18961-18961/com.werb.mediautilsdemo W/System.err: java.lang.RuntimeException: unlock failed
05-16 18:00:36.997 18961-18961/com.werb.mediautilsdemo W/System.err: at android.hardware.Camera.unlock(Native Method)
05-16 18:00:36.997 18961-18961/com.werb.mediautilsdemo W/System.err: at com.werb.mediautilsdemo.MediaUtils.prepareRecord(MediaUtils.java:141)
05-16 18:00:36.997 18961-18961/com.werb.mediautilsdemo W/System.err: at com.werb.mediautilsdemo.MediaUtils.startRecordThread(MediaUtils.java:299)
05-16 18:00:36.997 18961-18961/com.werb.mediautilsdemo W/System.err: at com.werb.mediautilsdemo.MediaUtils.record(MediaUtils.java:132)
05-16 18:00:36.997 18961-18961/com.werb.mediautilsdemo W/System.err: at com.werb.mediautilsdemo.activity.VideoRecorderActivity$2.onTouch(VideoRecorderActivity.java:92)

Video Bug

视频无法录制,各种崩溃。

找不到录制时间的设置...

我看了半天 还是没找到录制时间的设置....
现在找到了... 但是这个值应该设置成自定义, 并且和动画绑定上...

Android7.0及以上的系统调用前置摄像头问题

你好作者,我在之前也开发过视频录制的Demo,但是在遇到切换成前置摄像头的时候报错,并且是7.0及以上的系统就会报错,作者知道有什么解决的方法吗?相互学习,感激不尽!

视频录制完成之后,播放视频

您好,我想向您咨询一下,视频录制完成后,如果进行播放视频操作的思路。

我直接在MediaUtils的stopRecordSave方法中声明MediaPlayer并且用来播放之前录制的视频,但是一直不成功,提示状态不对,请问您知道什么方法去解决这个问题吗?

感谢!

三星note3有问题

demo下载直接运行 我用三个测试机测试,华为是7.0正常的,小米4.4也是正常的,三星note3 5.0 进入录像界面,demo中自定义的progressBar 控件有问题,长按没有绿色的进度条显示,双击放大崩溃。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.