Camera中onPreviewFrame()方法的视频方向旋转
来源:互联网 发布:淘宝无名体育怎么样 编辑:程序博客网 时间:2024/06/09 14:54
1、旋转90度
private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) { byte [] yuv = new byte[imageWidth*imageHeight*3/2]; // Rotate the Y luma int i = 0; for(int x = 0;x < imageWidth;x++) { for(int y = imageHeight-1;y >= 0;y--) { yuv[i] = data[y*imageWidth+x]; i++; } } // Rotate the U and V color components i = imageWidth*imageHeight*3/2-1; for(int x = imageWidth-1;x > 0;x=x-2) { for(int y = 0;y < imageHeight/2;y++) { yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+x]; i--; yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)]; i--; } } return yuv;}
2.旋转180度private static byte[] rotateYUV420Degree180(byte[] data, int imageWidth, int imageHeight) { byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2]; int i = 0; int count = 0; for (i = imageWidth * imageHeight - 1; i >= 0; i--) { yuv[count] = data[i]; count++; } i = imageWidth * imageHeight * 3 / 2 - 1; for (i = imageWidth * imageHeight * 3 / 2 - 1; i >= imageWidth * imageHeight; i -= 2) { yuv[count++] = data[i - 1]; yuv[count++] = data[i]; } return yuv;}
3.旋转270度
public static byte[] rotateYUV420Degree270(byte[] data, int imageWidth, int imageHeight) { byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2]; int nWidth = 0, nHeight = 0; int wh = 0; int uvHeight = 0; if (imageWidth != nWidth || imageHeight != nHeight) { nWidth = imageWidth; nHeight = imageHeight; wh = imageWidth * imageHeight; uvHeight = imageHeight >> 1;// uvHeight = height / 2 } // ??Y int k = 0; for (int i = 0; i < imageWidth; i++) { int nPos = 0; for (int j = 0; j < imageHeight; j++) { yuv[k] = data[nPos + i]; k++; nPos += imageWidth; } } for (int i = 0; i < imageWidth; i += 2) { int nPos = wh; for (int j = 0; j < uvHeight; j++) { yuv[k] = data[nPos + i]; yuv[k + 1] = data[nPos + i + 1]; k += 2; nPos += imageWidth; } } return rotateYUV420Degree180(yuv, imageWidth, imageHeight);}
注意:以上方法需要在callback的onPreviewFrame()中调用而且需要把原先
EncoderDebugger debugger = EncoderDebugger.debug(mSettings, mQuality.resX, mQuality.resY);
中参数mQuality.resX, mQuality.resY调换顺序以防花屏
EncoderDebugger debugger = EncoderDebugger.debug(mSettings, mQuality.resY, mQuality.resX);mPPS =debugger.getB64PPS();mSPS = debugger.getB64SPS();mProfilLevel = MP4Parser.toHexString(Base64.decode(mPPS, Base64.NO_WRAP),1,3);
这种方法效果比较合适,直接是转换数据。也查到了转换成jpeg格式,转换图片方向,再转成流传出去,这个方法时进行了压缩,数据减少导致编解码时buffer数组获取数据出问题。
结合
OrientationEventListener中的下例方法,进行屏幕方向检测,获取方向,以便方向旋转的判断选择。
@Overridepublic void onOrientationChanged(int orientation) { this.Orientation=orientation; Log.d("OrientationDetector","当前的传感器方向为"+orientation); if (orientation == ORIENTATION_UNKNOWN) return; Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(0, info); orientation = (orientation + 45) / 90 * 90; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { rotation = (info.orientation - orientation + 360) % 360; } else { // back-facing camera rotation = (info.orientation + orientation) % 360; } System.out.println("获取相机度数: "+ rotation); if (camera!=null){ Camera.Parameters parameters = camera.getParameters(); parameters.setRotation(rotation); camera.setParameters(parameters); }}
public int getOrientation(){//对外提供方向0,90,180,270 四个参数 return rotation;}
1 0
- Camera中onPreviewFrame()方法的视频方向旋转
- Android camera onPreviewFrame 图片旋转问题
- android camera 通过onPreviewFrame采集视频
- android camera 通过onPreviewFrame采集视频
- Camera的onPreviewFrame回调方法中图片帧数据data最后显示出现错位拼接的bug
- android camera onPreviewFrame后生成角度错误的图像后纠正方法
- 屏幕旋转--自动及手动控制(视频播放中setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法)
- Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据
- Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据
- iOS中检测当前设备的旋转方向(关闭屏幕旋转)
- 安卓开发——详解camera.rotate(x,y,z);的旋转方向
- camera 旋转的故事
- RCS video sharing 服务中视频方向和camera选项编解码
- tabbar的旋转方向
- 操作物体任意方向旋转的三种方法
- Android多媒体技术(一)Camera实时视频采集预览、拍照、JPEG图片方向的处理
- Android多媒体技术(一)Camera实时视频采集预览、拍照、JPEG图片方向的处理
- 第一次接触Camera 绘制实时帧,关于onpreviewframe,不回调的问题
- 三级缓存
- 【Linux】信号通讯编程
- 表达式语法分析——预测分析法
- Web Service快速入门
- AS Live Templates
- Camera中onPreviewFrame()方法的视频方向旋转
- 网站数据数据分析-网站js埋点
- 模拟
- 最短路模板 floyd+dijkstra+spfa
- spring+quartz实现任务调度
- Linux下的管道通信
- 【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo
- MATLAB 中的fix(),floor(),ceil(),以及round()
- 游戏开发中嵌入直播因素