Android 自定义视频录制翻转问题终极解决方案

  • 自定义视频录制
  • 使用系统可用播放器
  • 前后摄像和视频反转问题
  • 总结

自定义视频录制

mediarecorder = new MediaRecorder();// 创建mediarecorder对象mCamera = getCameraInstance(); // 获取cameraif (null == mCamera) {LogUtil.d("没有摄像头!");return;}mCamera.unlock();mediarecorder.setCamera(mCamera); // 设置录制视频源为Camera(相机)mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 设置录制文件质量,格式,分辨率之类,这个全部包括了
//        //mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
//注意:这里如果调用了setProfile这个方法的话, 再调用setOutputFormat();则会报错。
看看setProfile的源码实现:

public void setProfile(CamcorderProfile profile) {
setOutputFormat(profile.fileFormat);
setVideoFrameRate(profile.videoFrameRate);
setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
setVideoEncodingBitRate(profile.videoBitRate);
setVideoEncoder(profile.videoCodec);
if (profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_LOW &&
profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_QVGA) {
// Nothing needs to be done. Call to setCaptureRate() enables
// time lapse video recording.
} else {
setAudioEncodingBitRate(profile.audioBitRate);
setAudioChannels(profile.audioChannels);
setAudioSamplingRate(profile.audioSampleRate);
setAudioEncoder(profile.audioCodec);
}
}

所以,一般本人不使用上面这个方法。

mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);/ 设置录制的视频编码h263 h264mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);outPath = getOutMediaPath(); //造一个存放3gp文件路径
mediarecorder.setOutputFile(outPath);
mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 设置视频文件输出的路径try { // 准备录制mediarecorder.prepare(); // 开始录制mediarecorder.start();} catch (Exception e) {e.printStackTrace();e.getLocalizedMessage());}

此处省略了几处的代码:
1.camera于surfaceview的关联
2.生成视频文件存放路径
3.获取camera对象

使用系统可用播放器

以上讲述自定义视频录制的代码逻辑,下面说说怎么调用系统的播放器来播放你刚成功录制下的视频文件。

Uri data = Uri.fromFile(mediaEntity);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("configchange", 0); //忽略页面横竖屏切换
intent.setDataAndType(data, "video/3gp");
startActivity(intent);

注意一个点:video/3gp mediaType可以传video/* 或者具体的类型。
但是有一个小区别了。
像楼主设置的video/3gp 启动的时候会调用出系统中可以用来播放的播放器来提供选择,如UC播放器,爱奇艺播放器等。
如果设置的是video/* 则会直接调用系统的播放器播放。

前后摄像和视频反转问题

这里也是最烦人的地方, 网上的解决方案鱼龙混杂, 试了好多。
贴下几种看到的解决方案:
1.设置 mCamera.set(“rotation”,90); 试过,不行。
2.设置mCamera.setDisplayOrientation(90); 然并卵//

下面说下本人的解决方案:

mCamera.setDisplayOrientation(90); 这句必须要的。
第二:
2.1竖屏情况下:
如果是前置摄像头:
mediaRecorder.setOrientationHint(270);
如果是后置摄像头:
mediaRecorder.setOrientationHint(90);
2.2横情况下:
如果是前置摄像头:
mediaRecorder.setOrientationHint(180);
如果是后置摄像头:
mediaRecorder.setOrientationHint(0);
看了下源码解释:

/*** Sets the orientation hint for output video playback.* This method should be called before prepare(). This method will not* trigger the source video frame to rotate during video recording, but to* add a composition matrix containing the rotation angle in the output* video if the output format is OutputFormat.THREE_GPP or* OutputFormat.MPEG_4 so that a video player can choose the proper* orientation for playback. Note that some video players may choose* to ignore the compostion matrix in a video during playback.** @param degrees the angle to be rotated clockwise in degrees.* The supported angles are 0, 90, 180, and 270 degrees.* @throws IllegalArgumentException if the angle is not supported.**/public void setOrientationHint(int degrees) {if (degrees != 0   &&degrees != 90  &&degrees != 180 &&degrees != 270) {throw new IllegalArgumentException("Unsupported angle: " + degrees);}setParameter("video-param-rotation-angle-degrees=" + degrees);}

大概的意思的设置视频文件生成的翻转角度。那么前面那个
mCamera.setDisplayOrientation(90);应该就是摄像头翻转的角度。
可能有的人有点绕, 转来转去头晕晕的。楼主找了个帖子描述相机拍照成像原理,方便大家理解。传送门:
相机成像原理

总结

主要也是相机设备的成像原理没搞清楚。说实在,现在搞懂了也不太记得住。反正这问题也是困了我好几天了, 看了很多帖子也是被绕进去了, 各种不行,就是斜的, 要么左边斜,要么右边斜,来来回回反正正反面又不一样。两种成像原理。终于搞定了, 记录一下。希望对看官有帮助, thks 你的阅读,祝生活愉快!!

Android 自定义视频录制终极解决方案(翻转问题)相关推荐

  1. android 获取视频缩略图终极解决方案(ffmpeg)

    android 获取视频缩略图终极解决方案(ffmpeg) 参考文章: (1)android 获取视频缩略图终极解决方案(ffmpeg) (2)https://www.cnblogs.com/juka ...

  2. Android自定义视频录制

    文章目录 自定义相机的一般步骤 设置权限 检测相机 访问相机 检测相机功能 创建预览类 在布局文件中放预览视图 录制视频步骤 配置MediaRecorder 启动和停止MediaRecorder 释放 ...

  3. Android大图片裁剪终极解决方案 原理分析

    约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...

  4. Android自定义照相机录制视频

    Android端视频的录制: 1.自定义Camera和MediaRecorder录制视频和拍摄照片,基本功能都能实现,但是也存在一定的问题.a.后置摄像头拍摄完成后照片自动旋转90度或者270度b.如 ...

  5. android 后台视频录制【原创】

    2012-08-02 21:41:39|  分类: android记录 |  标签:android视频  |举报|字号 订阅 题记:记录下这几天一直在苦恼的一件事,心情各种起伏.先是有个变态的客户(嗯 ...

  6. android 录音原始文件_Android 11可能最终会取消Android对视频录制的4GB文件大小限制...

    2019年,智能手机品牌在相机质量上有了巨大的飞跃,尤其是在变焦和微光方面.另一方面,视频质量并没有得到同等的重视.2020年,随着高通骁龙(Qualcomm Snapdragon) 865网络服务提 ...

  7. android gpu 视频编码,Android Mp4视频录制(OpenGL实现篇,附DEMO)

    上一篇中(http://www.jianshu.com/p/113e4eedb752),我们已经了解了视频录制的大概流程,以及部分关键代码,在这一篇,我给大家介绍借助OpenGL来对视频图像进行处理的 ...

  8. Android 小视频录制

    一·视频录制界面 SurfaceView 的使用 SurfaceView我们可以把它当作一个容器,它放在所有窗口的下面·提供了一个可见区域,通过SurfaceHolder接口访问这个surface,g ...

  9. Android中小视频录制,预览

    工作中项目需求,在动态里面支持查看录制的小视频:录制视频主要用到Android中MediaRecorder这个类,在录制的过程中需要结合SurfaceView和Camera,Camera管理手机摄像头 ...

  10. Android小视频录制技术实现

    老大下达了一个要求,让我高仿一个类似微信录制小视频的功能,根据网上各路大神的demo及思路参考下,然后我就粗糙的做了一个小demo,个人感觉还不错,不喜者忽喷.源码链接在文件后面提供,欢迎大家学习及参 ...

最新文章

  1. AVR 又一个网址推荐
  2. php mysql.x86 64_centos7.2yum安装php70w.x86_64
  3. 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术
  4. SAP One Order redesign写操作的详细设计
  5. Vue Bootstrap OSS 实现文件追加上传、断点续传、极速秒传
  6. js小学生图区_推荐12个最好的 JavaScript 图形绘制库
  7. python报错怎么看_python中的错误如何查看
  8. rx java定时循环_Rxjava定时器异常循环
  9. python变量类型之间转换_【Python】Python 变量类型(变量赋值,数据类型,数据转换)...
  10. 使用Spring Cloud Security OAuth2搭建授权服务
  11. Chipmump文档
  12. 索菲对讲机写频软件_万能对讲机写频软件
  13. 红米K30Pro手机电路图纸 主板+小板电路原理图
  14. mysql是bsd协议吗_五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
  15. JVM学习笔记(12) 垃圾回收-垃圾回收相关算法
  16. 14年macmini装双硬盘_低配版Mac mini 2014机械硬盘换ssd图解
  17. 【设计】Adobe Xd 简明教程 对比 Sketch
  18. 2014.7.14 有用的网址
  19. 如何在服务器中搭建网站
  20. 模块化:ES Module与commonJS

热门文章

  1. 浅谈form标签与table标签
  2. 单片机课设中期报告_基于单片机的火灾自动报警系统 中期报告
  3. QQ音乐首页静态页面练习
  4. 210714 cypress
  5. Massive MIMO简介
  6. 序列相似性比较与同源分析
  7. arcgis 发布服务
  8. 沪深300期权可以程序化交易吗?
  9. 深度学习系列之Anchor based 和 Anchor free 目标检测方法
  10. 计算机软件毕业论文模板,计算机软件毕业论文提纲模板