




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【转自 MacroCheng 】Android视频流采集手机录像和PC同步 2011-05-24 15:32这个完全是站在巨人的肩膀上,网上流传甚广的一个帖子,只是他说他当时调通是基于1.5的系统在G3上调通的,我是在Nexus One上基于2.2的系统调通的。但是这里所指的调通只是指PC端为Windows的,我用的Ubuntu系统,在Ubuntu下就没有调通,在PC端运行出之后发送数据等等都很正常,但是就是不显示任何图像,很让人郁闷,不知道有没有那位大虾在Linux下调通的,欢迎交流! 下面就贴代码了:PC端(目前仅Windows下起作用):import java.awt.Frame;import java.awt.Graphics;import java.awt.Point;import java.awt.Transparency;import java.awt.color.ColorSpace;import java.awt.image.BufferedImage;import java.awt.image.ComponentColorModel;import java.awt.image.DataBuffer;import java.awt.image.DataBufferByte;import java.awt.image.PixelInterleavedSampleModel;import java.awt.image.Raster;import java.awt.image.SampleModel;import java.awt.image.WritableRaster;import java.io.DataInputStream;import java.io.DataOutputStream;import .ServerSocket;import .Socket;public class Main extends Frame private static final long serialVersionUID = 1L; private BufferedImage im; / 图像信息 / private final int width = 480; / private final int height = 320; private static final int width = 240; private static final int height = 160; private static final int numBands = 3; private static final int dataLen = 57600;/ 307200 OR 230400/57600 76800 private static final int tt = 28800;/ 14400;/28800; / 图像数组 private byte byteArray = new bytewidth * height * numBands;/ 图像RGB数组 private byte yuv420sp = new bytedataLen;/ 图像YUV数组 private static final int bandOffsets = new int 0, 1, 2 ; private static final SampleModel sampleModel = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE, width, height, 3, width * 3, bandOffsets); / ColorModel private static final ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); private static final ComponentColorModel cm = new ComponentColorModel(cs, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); public Main() super(Flushing); updateIM(); setSize(480, 320); / 窗口关闭方法 this.addWindowListener(new java.awt.event.WindowAdapter() public void windowClosing(java.awt.event.WindowEvent e) System.exit(0); ); / 窗口居中 this.setLocationRelativeTo(null); this.setResizable(false); this.setVisible(true); this.getData(); public void update(Graphics g) paint(g); public void paint(Graphics g) g.drawImage(im, 0, 0, 480, 320, this); public void getData() try System.out.print(等待连接n); ServerSocket server = new ServerSocket(8899); Socket socket = server.accept(); System.out.print(已建立连接!n); DataInputStream dis = new DataInputStream(socket.getInputStream(); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); while (true) for (int i = 0; i dataLen / tt; i+) dis.read(yuv420sp, i * tt, tt); / 得到数据之后立即更新显示 updateIM(); im.flush(); repaint(); dos.writeBoolean(true); catch (Exception ex) ex.printStackTrace(); private void updateIM() try / 解析YUV成RGB格式 decodeYUV420SP(byteArray, yuv420sp, width, height); DataBuffer dataBuffer = new DataBufferByte(byteArray, numBands); WritableRaster wr = Raster.createWritableRaster(sampleModel, dataBuffer, new Point(0, 0); im = new BufferedImage(cm, wr, false, null); catch (Exception ex) ex.printStackTrace(); private static void decodeYUV420SP(byte rgbBuf, byte yuv420sp, int width, int height) final int frameSize = width * height; if (rgbBuf = null) throw new NullPointerException(buffer rgbBuf is null); if (rgbBuf.length frameSize * 3) throw new IllegalArgumentException(buffer rgbBuf size + rgbBuf.length + minimum + frameSize * 3); if (yuv420sp = null) throw new NullPointerException(buffer yuv420sp is null); if (yuv420sp.length frameSize * 3 / 2) throw new IllegalArgumentException(buffer yuv420sp size + yuv420sp.length + minimum + frameSize * 3 / 2); int i = 0, y = 0; int uvp = 0, u = 0, v = 0; int y1192 = 0, r = 0, g = 0, b = 0; for (int j = 0, yp = 0; j 1) * width; u = 0; v = 0; for (i = 0; i width; i+, yp+) y = (0xff & (int) yuv420spyp) - 16; if (y 0) y = 0; if (i & 1) = 0) v = (0xff & yuv420spuvp+) - 128; u = (0xff & yuv420spuvp+) - 128; y1192 = 1192 * y; r = (y1192 + 1634 * v); g = (y1192 - 833 * v - 400 * u); b = (y1192 + 2066 * u); if (r 262143) r = 262143; if (g 262143) g = 262143; if (b 262143) b = 262143; rgbBufyp * 3 = (byte) (r 10); rgbBufyp * 3 + 1 = (byte) (g 10); rgbBufyp * 3 + 2 = (byte) (b 10); public static void main(String args) / Frame f = new Main(); Android端:Java代码:import java.io.DataInputStream;import java.io.DataOutputStream;import .Socket;import android.app.Activity;import android.content.res.Configuration;import android.graphics.PixelFormat;import android.hardware.Camera;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.view.SurfaceHolder.Callback;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity implements Callback, OnClickListener private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private Camera mCamera = null; private boolean mPreviewRunning = false; / 连接相关 private EditText remoteIP = null; private Button connect = null; private String remoteIPStr = null; / 视频数据 private StreamIt streamIt = null; public static Kit kit = null; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); mSurfaceView = (SurfaceView) this.findViewById(R.id.surface_camera); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); remoteIP = (EditText) this.findViewById(R.id.remoteIP); connect = (Button) this.findViewById(R.id.connect); connect.setOnClickListener(this); public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) if (mPreviewRunning) mCamera.stopPreview(); Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(width, height); streamIt = new StreamIt(); kit = new Kit(); mCamera.setPreviewCallback(streamIt); mCamera.setParameters(p); try mCamera.setPreviewDisplay(holder); catch (Exception ex) mCamera.startPreview(); mPreviewRunning = true; public void surfaceCreated(SurfaceHolder holder) mCamera = Camera.open(); public void surfaceDestroyed(SurfaceHolder holder) mCamera.stopPreview(); mPreviewRunning = false; mCamera.release(); Override public void onConfigurationChanged(Configuration newConfig) try super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation = Configuration.ORIENTATION_LANDSCAPE) else if (this.getResources().getConfiguration().orientation = Configuration.ORIENTATION_PORTRAIT) catch (Exception ex) class Kit implements Runnable private boolean run = true; / private final int dataLen=57600; /307200 OR 230400 76800 OR 57600 private final int tt = 28800; public void run() / TODO Auto-generated method stub try Socket socket = new Socket(46, 8899); / Socket socket = new Socket(5, 8899); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); DataInputStream dis = new DataInputStream(socket.getInputStream(); while (run) dos.write(streamIt.yuv420sp, 0, 28800); dos.write(streamIt.yuv420sp, 28800, 28800); dis.readBoolean(); Thread.sleep(155); catch (Exception ex) run = false; ex.printStackTrace(); Override public void onClick(View view) / TODO Auto-generated method stub if (view = connect) / 连接函数 / remoteIPStr = remoteIP.getText().toString(); new Thread(MainActivity.kit).start(); class StreamIt implements Camera.PreviewCallback public byte yuv420sp = null; private boolean t = true; public void onPreviewFrame(byte data, Camera camera) / TODO Auto-generated method stub / if(t) / t=false; / new Thread(AndroidVideo.kit).start(); / yuv420sp = data; 布局文件:还要记得在AndroidManifest.xml中添加如下的权限声明:这样就可以跑通了,效果还是很不错的,我用的WIFI,所有绿屏的现象还是比较少的,比较流畅。遗憾的是Ubuntu下没能调通。还需要努力阿!三步实现捕捉android手机摄像头视频流 来源: 赖智超的日志 1.创建Camera对象:var camera:Camera = Camera.getCamera();/获取Camera对象的实例。如果摄像头可用,返回一个Camera的对象,否则返回空。 if (camera = null) trace No camera is not supported!); else trace(Camera is OK); camera.setMode( 800, 400, 15, true );/设置视频分辨率和帧频 2.设置使用Android摄像头设备的权限 !CDATA 3.摄像头附加到视频对象private function connectCamera():void var video:Video = new Video(camera.width, camera.height); video.attachCamera(camera); addChild(video); 总结android音频视频操作 Android播放音乐和视频用的是类:MediaPlayer 刻录声音和视频用的是类:MediaRecorder 拍照:Camera 没什么难度,都是调用android的API 1.刻录视频,关键代码如下: Java代码 1. MediaRecordermediaRecorder=newMediaRecorder(); 2. mediaRecorder.reset();/首先重置一下 3. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);/从照相机种采集视频 4. mediaRecorder.setVideoSource(MediaRecorder.AudioSource.MIC);/从麦克风中采集声音 5. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);/输出格式3GP 6. mediaRecorder.setVideoSize(350,240);/视频文件大小 7. mediaRecorder.setVideoFrameRate(3);/录制帧数,每秒3帧 8. mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);/设置视频编码方式 9. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/设置声音编码方式 10. /*设置保存路径为sd卡根目录*/11. FilevideoFile=newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+.3gp); 12. mediaRecorder.setOutputFile(videoFile.getAbsolutePath(); 13. mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface();/定义一个SurfaceView来显示画面 14. mediaRecorder.prepare();/此处要捕捉异常,底层调用硬件实现准备工作 15. mediaRecorder.start(); 16. 17. /停止 18. mediaRecorder.stop(); 19. mediaRecorder.release(); 20. mediaRecorder=null; MediaRecorder mediaRecorder = new MediaRecorder();mediaRecorder.reset(); /首先重置一下mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); /从照相机种采集视频mediaRecorder.setVideoSource(MediaRecorder.AudioSource.MIC); /从麦克风中采集声音mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /输出格式3GPmediaRecorder.setVideoSize(350, 240); /视频文件大小mediaRecorder.setVideoFrameRate(3); /录制帧数,每秒3帧mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);/设置视频编码方式mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /设置声音编码方式/*设置保存路径为sd卡根目录*/File videoFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+.3gp);mediaRecorder.setOutputFile(videoFile.getAbsolutePath();mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface(); /定义一个SurfaceView来显示画面mediaRecorder.prepare(); /此处要捕捉异常,底层调用硬件实现准备工作mediaRecorder.start();/停止mediaRecorder.stop();mediaRecorder.release();mediaRecorder=null;2.刻录声音,关键代码如下: Java代码 1. /与录制视频很相似 2. mRecorder=newMediaRecorder(); 3. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);/声音来源麦克风 4. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);/输出格式 5. mRecorder.setOutputFile(mFileName);/可以自己给定保存文件 6. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/编码方式 7. mRecorder.prepare(); 8. mRecorder.start(); /与录制视频很相似 mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); /声音来源麦克风 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /输出格式 mRecorder.setOutputFile(mFileName); /可以自己给定保存文件 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /编码方式 mRecorder.prepare(); mRecorder.start(); 3.播放声音,关键代码如下: Java代码 1. MediaPlayermPlayer=newMediaPlayer(); 2. mPlayer.reset 3. mPlayer.setDataSource(mFileName);/设置播放的声音文件 4. mPlayer.prepare(); 5. mPlayer.start(); 6. 7. /. 8. /基本方法 9. mPlayer.pause()/暂停播放 10. mPlayer.stop()/停止播放 11. mPlayer.seekTo(int)/直接跳到某点进行播放 MediaPlayer mPlayer = new MediaPlayer(); mPlayer.reset mPlayer.setDataSource(mFileName); /设置播放的声音文件 mPlayer.prepare(); mPlayer.start(); /. /基本方法 mPlayer.pause() /暂停播放 mPlayer.stop() /停止播放 mPlayer.seekTo(int) /直接跳到某点进行播放4.播放视频,关键代码如下: Java代码 1. MeidaPlayermedia=newMeidaPlayer(); 2. media.setAudioStreamType(AudioManager.STREAM_MUSIC); 3. media.setDisplay(sh);/定义一个SurfaceView播放它 4. media.setDataSource(file.getAbsolutePa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 战略合作框架协议书-不良资产合作6篇
- 灵山食品安全培训课件
- 智能仓储物流机器人研发中心2025年技术创新推动物流行业智能化转型报告
- 2025内蒙古锡林郭勒盟锡林浩特市第二批公益性岗位人员招募136人考前自测高频考点模拟试题(含答案详解)
- 支付令申请书管辖
- 老婆入户申请书
- 小孩改姓申请书范文
- 二手设备销售协议范本5篇
- 众安保险退保申请书
- 2025-2030工业机器人应用场景拓展及技术突破分析报告
- 保障农民工工资课件
- 婴儿呛奶海姆立克急救法
- 扁桃体癌护理查房记录
- 人脸采集管理办法
- 壶腹部肿瘤的治疗及护理
- 感术行动培训课件
- 桥梁施工安全会议记录
- 附睾结核护理查房
- 膝关节炎中医护理
- 氦氖激光机治疗仪讲课件
- 乡村旅游环境卫生培训
评论
0/150
提交评论