fms java视频通信_Android基于fms的视屏通讯咋做

package net.john.activity;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.lang.reflect.Array;

import java.util.Map;

import net.john.R;

import net.john.util.RTMPConnectionUtil;

import net.john.util.RemoteUtil;

import net.john.util.UltraNetStream;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.hardware.Camera;

import android.hardware.Camera.CameraInfo;

import android.os.Build;

import android.os.Bundle;

import android.provider.MediaStore;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import com.shouyanwang.h264encoder;

import com.smaxe.io.ByteArray;

import com.smaxe.uv.client.INetStream;

import com.smaxe.uv.client.NetStream;

import com.smaxe.uv.client.camera.AbstractCamera;

import com.smaxe.uv.stream.support.MediaDataByteArray;

public class VideoActivity extends Activity{

final String TAG = "VideoActivity";

private boolean active;

public static AndroidCamera aCamera;

private h264encoder mH264encoder;

private long handle;

private Context context;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.layout_chat);

context=this;

mH264encoder = new h264encoder();

aCamera = new AndroidCamera(VideoActivity.this);

//

//  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {

//  for(int i=0; Camera.getNumberOfCameras();i++){

//

//   CameraInfo cameraInfo=new CameraInfo();

//   Camera.getCameraInfo(i, cameraInfo);

//   if(cameraInfo.facing==CameraInfo.CAMERA_FACING_FRONT){

//

//   }

//  }

new Thread(){

@Override

public void run() {

AndroidCamera androidCamera=new AndroidCamera(VideoActivity.this);

androidCamera.startVideo();

}

};

active = true;

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

new AlertDialog.Builder(VideoActivity.this)

.setMessage(R.string.dialog_exit)

.setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

active = false;

finish();

}

})

.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

dialog.dismiss();

}

}).show();

return true;

} else {

return super.onKeyDown(keyCode, event);

}

}

@Override

public void onStop() {

super.onStop();

aCamera = null;

if (RTMPConnectionUtil.netStream != null) {

RTMPConnectionUtil.netStream.close();

}

Log.d("DEBUG", "onStop");

}

@Override

public void onDestroy() {

super.onDestroy();

Log.d("DEBUG", "onDestroy()");

}

//

public class AndroidCamera extends AbstractCamera implements SurfaceHolder.Callback, Camera.PreviewCallback {

private static final int PICK_FROM_CAMERA = 0;

private SurfaceView surfaceView;

private SurfaceHolder surfaceHolder;

private Camera camera;

private int width;

private int height;

private boolean init;

int blockWidth;

int blockHeight;

int timeBetweenFrames; // 1000 / frameRate

int frameCounter;

byte[] previous;

public AndroidCamera(Context context) {

surfaceView = (SurfaceView)((Activity) context).findViewById(R.id.surfaceView);

surfaceHolder = surfaceView.getHolder();

surfaceHolder.addCallback(AndroidCamera.this);

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

width = 352;

height = 288;

handle = mH264encoder.initEncoder(width, height);

init = false;

Log.d("DEBUG", "AndroidCamera()");

}

private  void startVideo() {

Log.d("DEBUG", "startVideo()");

//连接服务端

RTMPConnectionUtil.netStream = new UltraNetStream(RTMPConnectionUtil.connection);

RTMPConnectionUtil.netStream.addEventListener(new NetStream.ListenerAdapter() {

@Override

public void onNetStatus(final INetStream source, final Map info){

Log.d("DEBUG", "Publisher#NetStream#onNetStatus: " + info);

final Object code = info.get("code");

if (NetStream.PUBLISH_START.equals(code)) {

if (VideoActivity.aCamera != null) {

RTMPConnectionUtil.netStream.attachCamera(aCamera, -1 /*snapshotMilliseconds*/);

Log.d("DEBUG", "aCamera.start()");

aCamera.start();

} else {

Log.d("DEBUG", "camera == null");

}

}

}

});

RTMPConnectionUtil.netStream.publish("aaa", NetStream.RECORD);

}

public void start() {

System.out.println("start");

camera.startPreview();

}

public void printHexString(byte[] b) {

System.out.println("printHexString");

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

Log.i(TAG, "数组16进制内容:"+hex.toUpperCase());

}

}

@Override

public void onPreviewFrame(byte[] arg0, Camera arg1) {

System.out.println("onPreviewFrame");

// TODO Auto-generated method stub

if (!active) return;

if (!init) {

blockWidth = 32;

blockHeight = 32;

timeBetweenFrames = 100; // 1000 / frameRate

frameCounter = 0;

previous = null;

init = true;

}

final long ctime = System.currentTimeMillis();

Log.i(TAG, "采集到的数组的长度:"+arg0.length);

/**将采集的YUV420SP数据转换为RGB格式*/

byte[] current = RemoteUtil.decodeYUV420SP2RGB(arg0, width, height);

try {

int byte_result = Decode(arg0);/**将采集到的每一帧视频数据用H264编码*/

byte[] bytes1 = copyOf(out,byte_result);

Log.i(TAG, "byte数组的长度:"+bytes1.length);

/**打包该编码后的H264数据*/

final byte[] packet = RemoteUtil.encode(current, previous, blockWidth, blockHeight, width, height);

fireOnVideoData(new MediaDataByteArray(timeBetweenFrames, new ByteArray(packet)));

previous = current;

if (++frameCounter % 10 == 0) previous = null;

}

catch (Exception e) {

e.printStackTrace();

}

final int spent = (int) (System.currentTimeMillis() - ctime);

try {

Log.i(TAG, "线程等待:"+Math.max(0, timeBetweenFrames - spent)+" s");

Thread.sleep(Math.max(0, timeBetweenFrames - spent));

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public byte[] copyOf(byte[] arr,int len)

{

System.out.println("copyOf");

Class type=arr.getClass().getComponentType();

byte[] target=(byte[])Array.newInstance(type, len);

System.arraycopy(arr, 0, target, 0, len);

return target;

}

private byte[] out = new byte[20*1024];

long start = 0;

long end = 0;

private int Decode(byte[] yuvData){

start = System.currentTimeMillis();

int result = mH264encoder.encodeframe(handle, -1, yuvData, yuvData.length, out);

end = System.currentTimeMillis();

Log.e(TAG, "encode result:"+result+"--encode time:"+(end-start));

if(result > 0){

try {

FileOutputStream file_out = new FileOutputStream ("/sdcard/x264_video_activity.264",true);

file_out.write(out,0,result);

file_out.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

//   this.setPrewDataGetHandler();

return result;

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// TODO Auto-generated method stub

camera.startPreview();

camera.unlock();

new Thread(){

@Override

public void run() {

AndroidCamera androidCamera=new AndroidCamera(context);

androidCamera.startVideo();

}

};

// startVideo();

Log.d("DEBUG", "surfaceChanged()");

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

//拍照功能

//   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//

//   intent.putExtra("camerasensortype", 1); // 调用前置摄像头

//   intent.putExtra("autofocus", true); // 自动对焦

//   intent.putExtra("fullScreen", false); // 全屏

//   intent.putExtra("showActionIcons", false);

//

//   startActivityForResult(intent, PICK_FROM_CAMERA);

camera = Camera.open();

if(camera!=null){

try {

camera.setPreviewDisplay(surfaceHolder);

camera.setPreviewCallback(this);

Camera.Parameters params = camera.getParameters();

params.setPreviewSize(width, height);

camera.setParameters(params);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

camera.release();

camera = null;

}

}else{

System.out.println("no!");

}

Log.d("DEBUG", "surfaceCreated()");

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

if (camera != null) {

camera.stopPreview();

camera.release();

camera = null;

}

mH264encoder.destory(handle);

Log.d("DEBUG", "surfaceDestroy()");

}

} //AndroidCamera

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值