




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【转自MacroCheng】Android视频流釆集机录像和PC同步2011-05-24 15:32这个完全是站在巨人的肩膀上,网上流传甚广的一个帖子,只是他说他当时调通是基于1.5 的系统在G3上调通的,我是在Nexus One上基于2.2的系统调通的。但是这里所指的调通 只是指PC端为Windows的,我用的Ubuntu系统,在Ubuntu下就没有调通,在PC端运行出 之后发送数据等等都很正常,但是就是不显示任何图像,很让人郁闷,不知道有没有那位大 虾在Linux下调通的,欢迎交流!下面就贴代码了:PC端(目前仅Windows下起作用):impo rt java.aw t.F rame;i
2、mpo rt java.aw t.Graphics;impo rt java.aw t.Poi nt;impo rt java.aw t.Transparency;impo rt java.aw t.color.ColorSpace;import java.awt. image.Bufferedlmage;import java.awt. image.ComponentColorModel;import java.awt. image.DataBuffer;import java.awt. image.DataBufferByte;import java.awt. image.Pixellnt
3、erleavedSampleModel;import java.awt. image.Raster;import java.awt. image.SampleModel;import java.awt. image.WritableRaster;impo rt java.io.Da talnp utStr eam;import java.io.DataOutputStream;impo rt java.ne t.ServerSocke t;impo rt java.ne t.Socke t;public class Main extends Frame private static final
4、 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/5760
5、0 76800private 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 = newPixelInterl
6、eavedSampleModel(DataBuffer.TYPE_BYTE, width, height, 3, width * 3, bandOffsets);/ ColorModelprivate static final ColorSpace cs =ColorSpace.getlnstance(ColorSpace.CS_sRGB);private static final ComponentColorModel cm = new ComponentColorModel(cs, false, false,Transparency.OPAQUE, DataBuffer.TYPE_BYTE
7、);public Main() super(Flushing);upda teIM();set Size(480, 320);/窗口关闭方法this.addWindowListener(new java.awt.event. WindowAdapter() public void windowClosing(java.aw t.even t.WindowEven t e) Sys tem.ex it(0););/窗口居中this.setLocationRelativeTo(null);t his.se tResizable(false);t his.se tV isible( tr ue);t
8、 his.ge tDat a();public void update(Graphics g) pain t(g);public void paint( Graphics g) g.drawlmage(im, 0, 0, 480, 320, t his);public void getData() try System.out.print(等待连接n);ServerSocket server = new ServerSocket(8899);Socke t socke t 二 server.accep t();System.out.print(已建立连接! n);DataInputStream
9、 dis = new DataInputStream(socket.getlnputStream(); DataOutputStream dos = newDataOutputStream(socket.getOutputStream();while (true) for (int i 二 0; i dataLen / tt; i+) dis.read(yuv420sp, i * tt, tt);/得到数据之后立即更新显示upda teIM();im.flush(); repai nt();dos.wr it eBoolean (tr ue); catch (Exception ex) ex.
10、pri ntSt ackTrace();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,
11、 null); catch (Exception ex) ex.pri ntSt ackTrace();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 IllegalArgum
12、entException(buffer rgbBuf size + rgbBuf.leng th+ 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 二
13、 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 = (0 xff & (int) yuv420spyp) 16;if (y 0)y = 0;if (i & 1) = 0) v = (0 xff & yuv420spuvp+) 128;u = (0 xff & yuv420spuvp+) 128;y1192 = 1192 * y;r = (y1
14、192 + 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();Andro
15、id 端:Java代码:impo rt java.io.Da talnp utStr eam;import java.io.DataOutputStream;impo rt java.ne t.Socke t;impo rt android.app.Ac tivity;import android.content. res.Configuration;import android.graphics.PixelFormat;import android.hardware.Camera;impo rt android.os.Bundle;import android.view.SurfaceHol
16、der;import android.view.SurfaceView;impo rt android.view.View;impo rt android.view.Window;import android.view.WindowManager;import android.view.SurfaceHolder.Callback;impo rt android.view.View.OnClickLis tener;import android.widget.Button;impo rt android.widge t.Ed it Tex t;public class MainActivity
17、 extendsActivity 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 remoteIPS
18、tr 二 null;/视频数据private StreamIt streamIt 二 null;public static Kit kit 二 null;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);getWindow().setFormat(PixelFormat.TRANSLUCENT);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.Layo
19、utParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentV iew(R.layo ut .main);mSurfaceView = (SurfaceView) this.findViewById(R.id.surface_camera); mSurfaceHolder = mSurfaceView.getHolder();mSurfaceHolder.addCallback(this);mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUS
20、H_BUFFERS);rem ot eIP = (Ed it Tex t) t his.findViewById(R.id.rem ot eIP); connec t 二(Button) t his.findViewById(R.id.connec t); connect.setOnClickListener (this);public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) if (mPreviewRunning) mCamera.s to pPreview();Camera.P
21、arame ters p = mCamera.ge tParame ters();p.se tPreviewSize(wid th, heigh t);str eam It 二 new Str eam It();kit 二 new Kit();mCamera.setPreviewCallback(streamIt);mCamera.se tParame ters(p);try mCamera.setPreviewDisplay(holder); catch (Exception ex) mCamera.s tart Preview(); mPreviewRunning = true;publi
22、c void surfaceCreated(SurfaceHolder holder) mCamera = Camera.open();public void surfaceDestroyed(SurfaceHolder holder) mCamera.s to pPreview();mPreviewRunning = false; mCamera.release();Overridepublic void onConfigurationChanged(Configuration newConfig) try super.onConfigurationChanged(newConfig);if
23、 (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=5760
24、0; /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 = newDataOutputStream(socket.getOutputStream();DataInputStream dis = newDataInputS
25、tream(socket.getlnputStream();while (run) dos.wri te(s treaml t.yuv420sp, 0, 28800); dos.wri te(s treaml t.yuv420sp, 28800, 28800);dis.readBoolean(); Thread.sleep(155); catch (Exception ex) run = false; ex.pri ntSt ackTrace();Override public void onClick(View view) / TODO Auto-generated method stub
26、if (view = connect) / 连接函数/ rem ot eIPS tr 二 rem ot eIP.ge tTex t().toStri ng(); new Thread(MainAc tivity.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 meth
27、od stub/ if(t)/ t=false;/ new Thread(AndroidVideo.k it).start();/ yuv420sp = data;布局文件:SurfaceView android:id=+id/surface_cameraandroid:layout_width=240px android:layout_height二160px /SurfaceView还要记得在AndroidManifest.xml中添加如下的权限声明:uses-permission android:name二android.permission.CAMERA /uses-permissio
28、n android:name二android.permission.INTERNET/uses-permission android:name二android.permission.ACCESS_WIFI_STATE/这样就可以跑通了,效果还是很不错的,我用的WIFI,所有绿屏的现象还是比较少的,比 较流畅。遗憾的是Ubuntu下没能调通。还需要努力阿!三步实现捕捉android手机摄像头视频流来源: 赖智超的日志1.创建 Camera 对象:var camera:Camera =Camera.getCamera();获取 Camera 对象的实 例。如果摄像头可用,返回一个Camera的对象
29、,否 则返回空。if (camera = null)trace No camera is not supported!);elsetrace(Camera is OK);camera.setMode( 800, 400, 15, true );/设 置视频分辨率和帧频2设置使用Android摄像头设备的权限!CDATAuses-permission android:name=android .permission .CAMERA/ 摄像头附加到视频对象3.private function connectCamera():voidvar video:Video = newVideo(camera
30、.width, camera.height);video.attachCamera(camera);addChild(video);总结 android 音频视频操作Android播放音乐和视频用的是类:MediaPlayer刻录声音和视频用的是类: MediaRecorder拍照: Camera没什么难度,都是调用 android 的 API刻录视频,关键代码如下:Java 代码MediaRecorder mediaRecorder = new MediaRecorder();mediaRecorder.reset(); /首先重置一下mediaRecorder.setVideoSource
31、(MediaRecorder.VideoSource.CAMERA); /从/ 照相机种 采集视频mediaRecorder.setVideoSource(MediaRecorder.AudioSource.MIC); /从/ 麦克风中采集 声音mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /输/ 出格 式 3GPmediaRecorder.setVideoSize 350, 240); /视频文件大小mediaRecorder.setVideoFrameRate 3); /录制帧数,每秒 3 帧med
32、iaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);股置视频编码 方式mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /设/ 置声音 编码方式/*设置保存路径为sd卡根目录*/File videoFile = new File(Environment.getExternalStorageDirectory(),System.currentTim eMillis()+.3gp);mediaRecorder.setOutputFile(videoF
33、ile.getAbsolutePath();mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface(); /定/ 义一个 SurfaceView 来显示画面mediaRecorder.prepare(); /此处要捕捉异常,底层调用硬件实现准备工作mediaRecorder.start();16.17. /停止mediaRecorder.stop();mediaRecorder.release();mediaRecorder=null;刻录声音,关键代码如下Java 代码/与录制视频很相似mRecorder = ne
34、w MediaRecorder();mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); /声音来源麦克风mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /输/ 出格 式mRecorder.setOutputFile(mFileName);/可以自己给定保存文件mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /编/ 码方式mRecorder.prepare();mRecorder
35、.start();播放声音,关键代码如下Java 代码MediaPlayer mPlayer = new MediaPlayer();mPlayer.resetmPlayer.setDataSource(mFileName); /设置播放的声音文件mPlayer.prepare();mPlayer.start();6.7. /8. /基本方法mPlayer.pause() /暂停播放mPlayer.stop() /停止播放mPlayer.seekTo(int) /直接跳到某点进行播放播放视频,关键代码如下Java 代码MeidaPlayer media = new MeidaPlayer();med
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源风力发电标准必要专利许可与风力发电场运维合作协议
- 管理部部长工作概述
- 护理进修述职
- 医院培训课件:《康复医学》
- 钢架大棚安装协议书
- 食堂转让转租协议书
- 车商汽车合同协议书
- 餐厅股东解散协议书
- 酒后驾驶赔偿协议书
- 车辆设备移交协议书
- 2025年北京市西城区高三语文二模考试卷附答案解析
- JJF 2215-2025移动源排放颗粒物数量检测仪校准规范
- 河北单招试题及答案英语
- 人工智能赋能新型工业化:范式变革与发展路径
- 2025中信建投证券股份限公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年中考第一次模拟考试化学试卷(广州卷)(全解全析)
- 毫针操作基本技术
- 2025-2030年中国CAE软件行业市场行情监测及发展前景研判报告
- 江苏南京历年中考作文题(2002-2024)
- 实验员考试试题及答案
- 2025年黄山黟县国有投资集团有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论