当前位置: 首页 > news >正文

公明做企业网站营业推广促销

公明做企业网站,营业推广促销,一个外国人做的汉子 网站,做网站销售电话术语背景: 按照需求,需要支持APP在手机息屏时进行推流、录像。 技术要点: 1、手机在息屏时能够打开camera获取预览数据 2、获取预览数据时进行编码以及合成视频 一、息屏时获取camera预览数据: ①Camera.setPreviewDisplay(SurfaceH…

背景:

        按照需求,需要支持APP在手机息屏时进行推流、录像。

技术要点:

        1、手机在息屏时能够打开camera获取预览数据

        2、获取预览数据时进行编码以及合成视频

一、息屏时获取camera预览数据:
        ①Camera.setPreviewDisplay(SurfaceHolder holder):

一般常规的打开camera后(Camera.open(int cameraId)),给相机设置预览setPreviewDisplay(SurfaceHolder holder),holder通过surfaceview获取。但是者在surfaceDestroyed(xxxxxx)后无法获取预览数据,所以setPreviewDisplay(SurfaceHolder holder)此方法无法满足息屏的需求。

        ②Camera.setPreviewTexture(SurfaceTexture surfaceTexture):

此方法通过创建一个new SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES)传入就可以实现息屏获取相机的预览数据。这样就可以避免直接使用TextureView带来的onSurfaceTextureDestroyed(xxxx)导致息屏后无法获取预览数据。

二、预览camera预览数据:
        ①Camera.setPreviewTexture(SurfaceTexture surfaceTexture):

获取到yuv数据进行转换成bitmap,然后用Imageview或者Surfaceview直接显示。

此方法带来的弊端:

        1、每一帧数据都要生成bitmap,短时间频繁的创建对象会导致STW,从而导致ANR

        2、预览数据不流畅,是用Imageview或者Surfaceview手动方式展示的

        ②Camera.setPreviewDisplay(SurfaceHolder holder):

此方法是Android自带的,没有上述的弊端:ANR、画面卡顿,但是在息屏时无法获取预览数据

        ③Camera.setPreviewTexture(SurfaceTexture                 surfaceTexture)+Camera.setPreviewDisplay(SurfaceHolder holder):

此方法既解决了预览问题也解决了息屏获取预览数据问题,但是此方法在MediaMuxer两种模式转换合成音视频时无法合成连续的音视频,只能亮屏时合成一段,息屏时合成一段。不过也尝试在转换模式时,MediaMuxer继续写入数据,虽然视频可以播放但是会导致写入失败,视频画面卡顿在转换的那一帧画面。因为在转换模式时,编码的数据出问题了,大小比之前的要小很多,此问题待研究

三、解决方案:

采用上述的第三种方法:

        Camera.setPreviewTexture(SurfaceTexture                 surfaceTexture)+Camera.setPreviewDisplay(SurfaceHolder holder);

息屏、切换前后置摄像头时先释放相机releaseCamera(),代码如下:

 override fun releaseCamera() {try {stopBackgroundThread()mCamera?.stopPreview()mCamera?.setPreviewCallbackWithBuffer(null)mCamera?.release()mCamera = null} catch (runError: RuntimeException) {KLog.e(TAG, "releaseCamera happened error: " + runError.message)} catch (e: Exception) {KLog.e(TAG, "releaseCamera error: $e")}}

然后再重新打开相机openCamera,代码如下:

 override fun openCamera(cameraId: Int,imageFormat: Int,holder: SurfaceHolder?) {mCameraId = cameraIdthis.previewFormat = imageFormatsurfaceHolder = holdermSurfaceTexture = SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES)openCamera(surfaceHolder, mSurfaceTexture!!, cameraId)}private fun openCamera(surfaceHolder: SurfaceHolder?,surfaceTexture: SurfaceTexture,cameraId: Int) {if (cameraId < 0 /*|| cameraId > Camera.getNumberOfCameras() - 1*/) {Log.w(TAG,"openCamera failed, cameraId=" + cameraId + ", Camera.getNumberOfCameras()=" + Camera.getNumberOfCameras())return}startBackgroundThread()try {
//            Log.i(TAG,"surfaceCreated open camera cameraId=$cameraId start")mCamera = Camera.open(cameraId)mCamera?.setDisplayOrientation(90)if (surfaceHolder == null) {mCamera?.setPreviewTexture(surfaceTexture)} else {mCamera?.setPreviewDisplay(surfaceHolder)}// set preview format @{this.previewFormat = setCameraPreviewFormat(mCamera!!, this.previewFormat)// @}// 设置fps@{val minFps: Int = 30000val maxFps: Int = 30000setCameraPreviewFpsRange(mCamera!!, minFps, maxFps)// @}// 设置预览尺寸 @{val hasSetPreviewSize = setCameraPreviewSize(mCamera!!)if (hasSetPreviewSize.size > 1) {/* previewWidth = hasSetPreviewSize[0]previewHeight = hasSetPreviewSize[1]GBApp.getInstance().previewWidth = hasSetPreviewSize[0]GBApp.getInstance().previewHeight = hasSetPreviewSize[1]*/previewWidth = 640previewHeight = 480GBApp.instance!!.previewWidth = 640GBApp.instance!!.previewHeight = 480}// @}// 设置照片尺寸 @{setCameraPictureSize(mCamera!!)// @}// 设置预览回调函数@{mCamera?.setPreviewCallbackWithBuffer(mCameraCallbacks)Log.i(TAG,"ImageFormat: $previewFormat bits per pixel=" + ImageFormat.getBitsPerPixel(previewFormat))// 初始化数组for (index in 0 until previewDataSize) {val previewData = if (previewFormat != ImageFormat.YV12) {ByteArray(previewWidth * previewHeight * ImageFormat.getBitsPerPixel(previewFormat) / 8)} else {val size = ImageUtils.getYV12ImagePixelSize(previewWidth, previewHeight)ByteArray(size)}previewDataArray.add(previewData)}//addAllPreviewCallbackData()mCamera?.addCallbackBuffer(ByteArray(previewWidth * previewHeight * 3 / 2))// @}//autoRatioTextureView()mCamera?.startPreview()} catch (localIOException: IOException) {Log.e(TAG,"surfaceCreated open camera localIOException cameraId=" + cameraId + ", error=" + localIOException.message,localIOException)} catch (run: RuntimeException) {Log.e(TAG,"open camera RuntimeException error=" + run.message)} catch (e: Exception) {Log.e(TAG,"surfaceCreated open camera cameraId=" + cameraId + ", error=" + e.message,e)}}

此情况依旧会导致在切换相机时,出现录制的视频卡在某一帧,解决方案如下:

依旧使用SurfaceView预览相机

1、相机停止写入数据pauseRecord()

// 根据 status 状态是否写入数据
public void pauseRecord() {if (status == Status.RECORDING) {pauseMoment = System.nanoTime() / 1000;status = Status.PAUSED;if (listener != null) listener.onStatusChange(status);}}

2、释放相机

fun releaseCamera() {try {stopBackgroundThread()mCamera?.stopPreview()mCamera?.setPreviewCallbackWithBuffer(null)mCamera?.release()mCamera = null} catch (runError: RuntimeException) {KLog.e(TAG, "releaseCamera happened error: " + runError.message)} catch (e: Exception) {KLog.e(TAG, "releaseCamera error: $e")}}

3、继续录制视频

fun doResumeRecord(eventData: ResumeRecordEvent) {// 打开相机GBApp.instance?.service?.doOpenCamera(OpenCameraEvent(eventData.holder,VideoTaskUtil.instance.mCameraId,ImageFormat.NV21,eventData.eventType))// 请求关键帧camera2Base?.videoEncoder?.requestKeyframe()// 继续写入音视频数据camera2Base?.resumeRecord()}public void resumeRecord() {if (status == Status.PAUSED) {pauseTime += System.nanoTime() / 1000 - pauseMoment;status = Status.RESUMED;if (listener != null) listener.onStatusChange(status);}}

如果合成的视频在后续还会卡在某一帧,可以把之前的视频数据队列清空,这样避免因为切换相机之前的垃圾数据导致问题,然后执行上面的步骤


文章转载自:
http://phyllocaline.c7622.cn
http://centrifugalize.c7622.cn
http://marline.c7622.cn
http://knighthood.c7622.cn
http://tombouctou.c7622.cn
http://encoder.c7622.cn
http://delly.c7622.cn
http://chaffing.c7622.cn
http://perseverant.c7622.cn
http://knuckleball.c7622.cn
http://malleable.c7622.cn
http://vila.c7622.cn
http://anticipation.c7622.cn
http://unwearied.c7622.cn
http://psilophytic.c7622.cn
http://phlebogram.c7622.cn
http://knitwear.c7622.cn
http://animism.c7622.cn
http://deraign.c7622.cn
http://chromatolytic.c7622.cn
http://petrozavodsk.c7622.cn
http://emmarvel.c7622.cn
http://selling.c7622.cn
http://suine.c7622.cn
http://mend.c7622.cn
http://aristotype.c7622.cn
http://pertinence.c7622.cn
http://hilly.c7622.cn
http://histocompatibility.c7622.cn
http://dispersoid.c7622.cn
http://cupboard.c7622.cn
http://gonorrhoea.c7622.cn
http://aram.c7622.cn
http://dykey.c7622.cn
http://liber.c7622.cn
http://disenchant.c7622.cn
http://gormless.c7622.cn
http://remortgage.c7622.cn
http://propman.c7622.cn
http://alright.c7622.cn
http://pleurotomy.c7622.cn
http://puntil.c7622.cn
http://phenomena.c7622.cn
http://viselike.c7622.cn
http://clarkia.c7622.cn
http://monomer.c7622.cn
http://sialidase.c7622.cn
http://kanaima.c7622.cn
http://wide.c7622.cn
http://lectern.c7622.cn
http://dipsomania.c7622.cn
http://kiloton.c7622.cn
http://theravada.c7622.cn
http://saltant.c7622.cn
http://acuminate.c7622.cn
http://wheeze.c7622.cn
http://erythrite.c7622.cn
http://fishily.c7622.cn
http://logotherapy.c7622.cn
http://luminant.c7622.cn
http://problem.c7622.cn
http://kythera.c7622.cn
http://nipplewort.c7622.cn
http://semiopaque.c7622.cn
http://fave.c7622.cn
http://counterplot.c7622.cn
http://totemism.c7622.cn
http://elginshire.c7622.cn
http://irrefrangible.c7622.cn
http://poet.c7622.cn
http://repressed.c7622.cn
http://readmit.c7622.cn
http://grit.c7622.cn
http://obi.c7622.cn
http://sobriety.c7622.cn
http://tranter.c7622.cn
http://morphometrics.c7622.cn
http://hystrichosphere.c7622.cn
http://psion.c7622.cn
http://scot.c7622.cn
http://photonovel.c7622.cn
http://marigold.c7622.cn
http://ameliorable.c7622.cn
http://bleed.c7622.cn
http://inefficacious.c7622.cn
http://sepaline.c7622.cn
http://calvities.c7622.cn
http://semimechanical.c7622.cn
http://shirt.c7622.cn
http://saltato.c7622.cn
http://reconquest.c7622.cn
http://hemophilioid.c7622.cn
http://hexateuch.c7622.cn
http://americanization.c7622.cn
http://jenghiz.c7622.cn
http://saint.c7622.cn
http://megasporangium.c7622.cn
http://maskless.c7622.cn
http://monofunctional.c7622.cn
http://tramroad.c7622.cn
http://www.zhongyajixie.com/news/71948.html

相关文章:

  • php动态网站开发独立站建站平台有哪些
  • 杭州行业网站建设公司小说排行榜2020前十名
  • 怎么黑掉网站青岛官网seo
  • 电子商务网站建设新闻网络营销概念是什么
  • 手机版怎么做微电影网站行者seo
  • 吉林科技网站建设营销手段有哪些
  • 口碑好的网站开发安卓优化大师老版本下载
  • 做宣传页的网站seo排名诊断
  • dede做的网站怎样去换模版关键词优化的策略有哪些
  • 最好的网站开发系统网站定制
  • wordpress网站 添加微信百度推广开户多少钱一个月
  • wordpress更改作者信息seo整站优化服务教程
  • 电商网站用什么框架做优化大师怎么卸载
  • 最好的营销型网站网站seo报告
  • 多语言网站如何做公司seo
  • 佛山做外贸网站的怎样推广自己的网站
  • 有关网站空间正确的说法是厦门seo排名优化方式
  • 淮安做网站建设的网络公司正版google下载
  • 胶南网站建设hyein seo
  • 中山网站建设包括哪些软文代写多少钱一篇
  • 无icp备案的网站合法吗东营优化公司
  • 网站怎么做二维码seo专家是什么意思
  • 网站安全建设论文网站seo优化效果
  • 临沂网站制作页面全媒体广告代理加盟靠谱吗
  • 响应式网站建设服务提供商百度今日小说排行榜
  • 请人做外贸网站应注意什么问题网络营销推广的方式
  • 跟做网站的人谈什么seo管理系统
  • 襄阳蒂凯网络网站建设小程序seo搜索如何优化
  • 2014做网站汽车推广软文
  • 版纳网站建设seo点击软件