Android实时监控项目第四篇:后台线程发送预览帧视频数据

还记得上篇提到的setPreviewCallback(Camera.PreviewCallback cb)函数吗?我们在开始预览帧视频之前,调用的它,这里要注意其内部的Camera.PreviewCallback类型的参数,我们需要写一个类继承Camera.PreviewCallback的类,在该类中覆写public void onPreviewFrame(byte[] data, Camera camera)方法,这里的data参数保存的即是预览帧是视频数据,一旦程序调用Camera.PreviewCallback接口,便会自动调用发方法,因此当我们在开始预览帧视频之前调用setPreviewCallback(Camera.PreviewCallback cb)函数时,便会回调该方法,理论上来说我们在这个方法中写发送帧视频的代码就行了,但实际上我们并不能这么做,因为发送视频数据是一个很耗时的操作,为了防止UI线程阻塞,我们需要另外开启一个线程,在该线程中实现视频的发送操作

这里我们采用AsyncTask<Void, Void, Void>后台线程,因此我们需要再写一个类,继承AsyncTask<Void, Void, Void>抽象类,并覆写其中的protected Void doInBackground(Void... params)方法,在该方法中编写发送视频数据的程序即可,这里要注意形参的含义,因为的项目中不需要用到这三个参数,因此全部传入Void,关于AsyncTask的详细使用,可以参见这两篇博客:http://blog.csdn.net/ns_code/article/details/12889455http://blog.csdn.net/liuhe688/article/details/6532519,我在该方法中写的代码如下:

//该方法运行在后台线程中,主要负责执行耗时的后台计算传输等工作,
//实际的后台操作被UI Thread调用时,该方法被回调
@Override
protected Void doInBackground(Void... params) {
	//cam = (CameraActivity)context;
	Size size = cam.getCamera().getParameters().getPreviewSize();
	int wide = size.width;
	int high = size.height;
	YuvImage image = new YuvImage(data, ImageFormat.NV21, wide, high, null);
	//因为要实时处理视频流,因此用内存操作流比较合适
	ByteArrayOutputStream os = new ByteArrayOutputStream(data.length);
    if(!image.compressToJpeg(new Rect(0, 0, wide, high), 100, os)){
        return null;
    }
    send(os);
	return null;
}

这里倒数第三行的send(os)记为发送视频的操作,当然,如果你是做其他的操作,而不是传输视频数据,你也可以将其改为其他的函数,比如做街景检测、人脸车牌识别等,而其他代码基本不用修改,发送视频的send方法基本就是按照TCP协议编写,在JAVA中是用Socket类编写客户端的代码:

//发送视频流到PC端,这里传递过来的参数os中保存的是视频输出流数据
private void send(ByteArrayOutputStream os) {
	
	//定义用来保存从输入流中读取的视频流数据的byte数组
	byte[] buffer = new byte[1024];
	try {
		Socket client = new Socket(ipName,30000);
		OutputStream outSocket = client.getOutputStream();
		//实例化内存输入流,将视频流数据写入到内存中
		ByteArrayInputStream inputFromOs = new ByteArrayInputStream(os.toByteArray());
		//不断从内存中读取数据到buffer中,不断再从buffer中将视频数据发送到outSocket流中
		int amount;
		while((amount =inputFromOs.read(buffer) ) != -1)
			outSocket.write(buffer, 0, amount);
		//这里需要刷新用到缓冲区的输出流
		os.flush();
		inputFromOs.close();
		os.close();
		outSocket.close();
	} catch (UnknownHostException e) {
		e.printStackTrace();
		System.out.println("无法找到要连接的服务器");
	} catch (IOException e) {
		e.printStackTrace();
		System.out.println("IO错误");
	}
}	

最后,什么时候调用protected Void doInBackground(Void... params)方法呢?看了上面那两篇博客,应该也会明白了,当调用execute(Params... params)方法时,便会自动回调该方法,从而执行其内部代码。


至此,整个项目的Android客户端代码已经编写完毕,下篇将讲述PC端(亦即服务端)代码的实现

Android音频系统之AudioTrack与AudioFlinger数据交互 一、前言: 在前面的三篇博客中,分析了AP和AF,AT之间的初始化及流程,因为是按照代码逻辑分析的,所以相对比较按部就班,有些关键和需要串联的地方没有分析到,而这篇博客则是针对一些关键点,进行深入和串联,尽量能将三者的关系结合地更紧密。 二、分析: 1.native层audiotrack中,write操作是如何发起的? 在代码调试中,我们看到,thread线程不停地读取audioflinger中共... 阅读详情

相关推荐

Base——Thread类

1.基类 2.成员变量 started_:线程是否运行 pthreadId_:线程id tid_:线程真实ID func_:线程函数 name_:线程名字 numCreated_:线程数(原子类型,参看Atomic_unittest类) 3.__thread muduo-0.9.1版本: __thread修饰的变量属于线程自己内部的局部变量 注 muduo新版在 Curren...

神秘的火柴人的专栏 641

Android线程可断点续传上传文件至服务器Demo

Android线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)

Android 循环录制最近一段时间的视频

Android 循环录制最近一段时间的视频 在日常开发测试中,往往发生问题了再去想办法复现录屏、抓取日志的工作,往往会出现偶现问题很难复现,导致问题很难定位。在这里给出一个能抓取历史操作视频的解决方案: 将录屏的视频数据的缓存到一块固定大小的内存中(空间循环利用) 发现问题时,触发混合器(MediaMuxer)将指定时间范围的视频数据取出存储为指定的mp4文件 数据缓存 数据缓存用来解决历史数据保存,需要合理的分配内存大小,根据自己的实际情况(手机屏幕分辨率、多长时间的视频记录等等)选择合适的

lkl22的专栏 3099

视频编码录制 BaseMediaEncoder类

GBaseMediaEncoder package com.example.glivepush.encodec; import android.content.Context; import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.media.MediaMuxer; import android.util.Log; im

we1less的博客 1526

(一)Android camera2 实现相机预览及获取预览数据

一、本文重点说明 本文基于 android camera2 实现视频预览,暂未兼容 camera1 API,基础实现可以参考 googlesample Camera2 例子 android-Camera2Basic ,本文以工具类形式实现一步调用。 谷歌例子中没有具体指明预览的获取,即 camera1 setPreviewCallback 类似功能实现,具体是通过 ImageReader 中...

ganfanzhou的博客 5万+

android后台实时视频,Android实时监控项目第四篇后台线程发送预览视频数据...

还记得上篇提到的setPreviewCallback(Camera.PreviewCallback cb)函数吗?我们在开始预览视频之前,调用的它,这里要注意其内部的Camera.PreviewCallback类型的参数,我们需要写一个类继承Camera.PreviewCallback的类,在该类中覆写public void onPreviewFrame(byte[] data, Camera ...

weixin_34571341的博客 337

Android后台实时监控项目:通过摄像头实时预览视频

Android后台实时监控项目:通过摄像头实时预览视频。本类可直接导入项目中使用,不需要窗体,直接在后台service中即可调用摄像头获取数据并转发到服务器。碰到的问题是,相机默认是横屏摄像,需要把图像向左旋转90.

byc6352的专栏 1483

Android实时监控项目第三篇:通过摄像头实时预览视频

在第二个Activity中,我们要显示摄像头预览视频,布局文件很简单,就一个SurfaceView组件,设置为占满整个父组件(这里不再给出),用来显示预览视频。       在对应的Activity文件中,要获取SurfaceView的SurfaceHolder,并为其添加一个回调监听器,该监听器传入一个Callback实例,这里需要覆写Callback实例中的三个方法,分别是:

专注Android开发 4061

Android实时监控项目第一篇:项目分析及AVD模拟效果图

Android实时监控项目主要涉及Socket编程、Android摄像头对预览视频流的采集和处理等。    【1】主要实现功能:通过Android客户端摄像头采集视频数据,并实时地发送到PC端进行显示。    【2】设计思路:1、创建一个Activity,获取需要连接的PC端的IP地址(由用户输入),如果IP地址合法,则跳转到预 览视频流的Activity中;

兰亭风雨的专栏 4703

Android 手机采集摄像头视频 socket 视频传输实时传播

这里搜集了两种实现Android 手机采集摄像头视频 socket 视频传输实时传播的方法,两种都可以使用。 第一种如下: 1.通过客户端socket请求,服务端接受到请求后,获取socket的输出流对象outs。 2.服务端通过Camera的setPreviewCallback方法回调采集摄像头视频数据,将一张张图片数据数据压缩,发送到客户端,因为是图片,需要在图片开头加个标记,然后指定...

xiaoxixi1918的专栏 3025

Android利用TCP/IP、UDP、Http、Socket、多线程等实现局域网实时监控、文件快传、搜索设备等

RT:Android利用TCP/IP、UDP、Http、Socket、多线程等实现局域网实时监控、文件快传、搜索设备等。首先介绍项目库文件主要实现在局域网(热点、WIFI)内的实时监控、文件浏览(类似云盘)、文件批量下载、文件删除、客户端操作服务端的Http指令、局域网内的设备IP搜索、消息推送等。接下来介绍各模块主要职能:TCP/IP-主要负责将服务端的预览视频画面实时传输到客户端,经过Andr...

Engineer-Jsp的专栏 3781

Android集成海康摄像头:实时预览与无预览抓拍实战指南

在物联网与智能安防领域,设备联网与音视频流处理是核心技术基础。其原理在于通过网络协议与设备建立通信,获取编码后的媒体数据流,并在客户端进行解码与渲染,从而实现远程监控与管理。这项技术的核心价值在于打破了物理距离限制,实现了信息的实时同步与可视化,广泛应用于智慧园区、智能家居、远程巡检等场景。其中,海康威视作为行业领先的设备提供商,其SDK的集成是Android开发者实现摄像头对接的关键环节。本文将聚焦于**实时视频预览**与**无预览抓拍**这两个高频需求,详细解析从SDK配置、设备登录到画面渲染与异步抓拍

weixin_34174105的博客 379

大华视频技术:实时监控与报警系统综合演示

对于企业来说,安全监控系统不仅是为了满足安全法规的要求,更是确保企业资产与员工安全的重要手段。企业安全监控系统需要能够覆盖企业的关键区域,监控进出人员和车辆,同时能及时发现并响应各种安全隐患。企业安全监控的需求主要包括以下几点:关键区域覆盖:监控系统必须对企业的仓库、财务室、研发中心等关键区域进行全方位覆盖。访客管理:需要能够记录所有进出企业的访客信息,并能够快速识别异常行为。安全威胁预警:系统应能够通过模式识别和行为分析,提前预警潜在的安全风险。应急响应。

weixin_42584586的博客 1219

Android图形处理深度解析:Grafika如何破解高性能渲染与编码难题

Android图形开发的世界里,开发者常常面临一个尴尬的现实:系统提供的图形API强大而复杂,但实际应用中却处处是坑。从Camera预览卡顿到视频编码内存泄漏,从OpenGL ES上下文管理到多线程渲染同步,每一个环节都可能成为性能瓶颈的源头。Grafika项目正是为了解决这些痛点而生——它不是另一个教科书式的示例集合,而是一个**实战导向的问题解决工具箱**,直接针对Android图形开发中最

gitblog_00016的博客 908

Android和C#实时视频传输Demo

说起去年的Demo。以今天的免费整齐优势。 原理很easy,虽然没有写android申请书。但,好了~ 高级语言是相通的。傲慢约。就这么简单研究了一下api后,找到相机对象有一个预览回调方法。 意识到发生了什么Camera.PreviewCallback接口。就能够得到一个每一画面的回调事件,那么思路就非常easy了。 拿到画面后,进行下简单的压缩,然后把图像用Socket传输到s...

weixin_33847182的博客 973
上一篇: 进程页表与内核页表:页表的初始化
下一篇: ORA-16038错误--当前REDO不能归档解决-转载整理
iteye_7527
博客等级 码龄8年 63粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值