- 浏览: 2205063 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
目前实时抓取手机视频数据有2种方法,一种是通过camera的回调获取源数据,这里获取的源数据是没有编码的数据。
有的人发送yuv数据然后在那绘制图片,也说视频聊天,真是可笑。这种方式是可是实现视频聊天的,但是需要移植编码库
目前可移植的有,android的opencore编码
ffmpeg编码,这个网上很难找,但是也有人实现哦。(编码效率好,但是支持不了高清视频)
编码完成可以通过rtp协议发送。就可以视频啦。rtp协议什么的就不说了哦。
以上方法的代码,在这个链接最好回复我贴了代码,不是完整的。链接:http://www.eoeandroid.com/thread-51460-1-1.html
第2种方法,也就是我用的方法。
通过MediaRecorder录制。然后绑定一个localsocket,可以获取编码后的视频数据传输;
代码如下:
有的人发送yuv数据然后在那绘制图片,也说视频聊天,真是可笑。这种方式是可是实现视频聊天的,但是需要移植编码库
目前可移植的有,android的opencore编码
ffmpeg编码,这个网上很难找,但是也有人实现哦。(编码效率好,但是支持不了高清视频)
编码完成可以通过rtp协议发送。就可以视频啦。rtp协议什么的就不说了哦。
以上方法的代码,在这个链接最好回复我贴了代码,不是完整的。链接:http://www.eoeandroid.com/thread-51460-1-1.html
第2种方法,也就是我用的方法。
通过MediaRecorder录制。然后绑定一个localsocket,可以获取编码后的视频数据传输;
代码如下:
package com.pei; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.os.Bundle; import android.graphics.PixelFormat; import android.media.MediaRecorder; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; /** * class name:VideoCameraActivity<BR> * class description:CATCH THE VIDEODATA SEND TO RED5<BR> * PS: <BR> * * @version 1.00 2011/11/05 * @author CODYY)peijiangping */ public class VideoCameraActivity extends Activity implements SurfaceHolder.Callback, MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener { private static final int mVideoEncoder = MediaRecorder.VideoEncoder.H264; private LocalSocket receiver, sender; private LocalServerSocket lss; private MediaRecorder mMediaRecorder = null; private boolean mMediaRecorderRecording = false; private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private Thread t; @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); SurfaceHolder holder = mSurfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceView.setVisibility(View.VISIBLE); receiver = new LocalSocket(); try { lss = new LocalServerSocket("VideoCamera"); receiver.connect(new LocalSocketAddress("VideoCamera")); receiver.setReceiveBufferSize(500000); receiver.setSendBufferSize(500000); sender = lss.accept(); sender.setReceiveBufferSize(500000); sender.setSendBufferSize(500000); } catch (IOException e) { finish(); return; } } @Override public void onPause() { super.onPause(); if (mMediaRecorderRecording) { stopVideoRecording(); try { lss.close(); receiver.close(); sender.close(); } catch (IOException e) { e.printStackTrace(); } } finish(); } private void stopVideoRecording() { System.out.println("stopVideoRecording"); if (mMediaRecorderRecording || mMediaRecorder != null) { if (t != null) t.interrupt(); releaseMediaRecorder(); } } private void startVideoRecording() { (t = new Thread() { public void run() { int frame_size = 20000; byte[] buffer = new byte[1024 * 64]; int num, number = 0; InputStream fis = null; try { fis = receiver.getInputStream(); } catch (IOException e1) { return; } number = 0; releaseMediaRecorder(); while (true) { System.out.println("ok"); try { num = fis.read(buffer, number, frame_size); number += num; if (num < frame_size) { System.out.println("recoend break"); break; } } catch (IOException e) { System.out.println("exception break"); break; } } initializeVideo(); number = 0; Consumer consumer = new Publisher();// Publisher继承了Consumer Thread consumerThread = new Thread((Runnable) consumer); consumer.setRecording(true);// 设置线程状态; consumerThread.start();// 开始发布数据流 DataInputStream dis = new DataInputStream(fis); try { dis.read(buffer, 0, 32); } catch (IOException e1) { e1.printStackTrace(); } byte[] aa = { 0x01, 0x42, (byte) 0x80, 0x0A, (byte) 0xFF, (byte) 0xE1, 0x00, 0x12, 0x67, 0x42, (byte) 0x80, 0x0A, (byte) 0xE9, 0x02, (byte) 0xC1, 0x29, 0x08, 0x00, 0x00, 0x1F, 0x40, 0x00, 0x04, (byte) 0xE2, 0x00, 0x20, 0x01, 0x00, 0x04, 0x68, (byte) 0xCE, 0x3C, (byte) 0x80 }; consumer.putData(System.currentTimeMillis(), aa, 33); while (true) { try { int h264length = dis.readInt(); number = 0; while (number < h264length) { int lost = h264length - number; num = fis.read(buffer, 0, frame_size < lost ? frame_size : lost); number += num; consumer.putData(System.currentTimeMillis(), buffer, num); } } catch (IOException e) { break; } } consumer.setRecording(false);// 设置线程状态; } }).start(); } private boolean initializeVideo() { System.out.println("initializeVideo"); if (mSurfaceHolder == null) return false; mMediaRecorderRecording = true; if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); else mMediaRecorder.reset(); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoFrameRate(20); mMediaRecorder.setVideoSize(352, 288); mMediaRecorder.setVideoEncoder(mVideoEncoder); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setMaxDuration(0); mMediaRecorder.setMaxFileSize(0); mMediaRecorder.setOutputFile(sender.getFileDescriptor()); try { mMediaRecorder.setOnInfoListener(this); mMediaRecorder.setOnErrorListener(this); mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IOException exception) { releaseMediaRecorder(); finish(); return false; } return true; } private void releaseMediaRecorder() { System.out.println("Releasing media recorder."); if (mMediaRecorder != null) { if (mMediaRecorderRecording) { try { mMediaRecorder.setOnErrorListener(null); mMediaRecorder.setOnInfoListener(null); mMediaRecorder.stop(); } catch (RuntimeException e) { System.out.println("stop fail: " + e.getMessage()); } mMediaRecorderRecording = false; } mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { System.out.println("surfaceChanged"); mSurfaceHolder = holder; if (!mMediaRecorderRecording) { initializeVideo(); startVideoRecording(); } } @Override public void surfaceCreated(SurfaceHolder holder) { System.out.println("surfaceCreated"); mSurfaceHolder = holder; } @Override public void surfaceDestroyed(SurfaceHolder holder) { System.out.println("surfaceDestroyed"); mSurfaceView = null; mSurfaceHolder = null; mMediaRecorder = null; if (t != null) { t.interrupt(); } } @Override public void onInfo(MediaRecorder mr, int what, int extra) { switch (what) { case MediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN: System.out.println("MEDIA_RECORDER_INFO_UNKNOWN"); break; case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED: System.out.println("MEDIA_RECORDER_INFO_MAX_DURATION_REACHED"); break; case MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED: System.out.println("MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED"); break; } } @Override public void onError(MediaRecorder mr, int what, int extra) { if (what == MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN) { System.out.println("MEDIA_RECORDER_ERROR_UNKNOWN"); finish(); } } }
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 635本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1111颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1005从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1181Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1020Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 848前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 937监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 808在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 979最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1344##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1143当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 793setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1528问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 781底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1792点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1384import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2338TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1567一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 880Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 942最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
在Android开发中,有时我们需要处理实时视频流,例如播放RTSP流、抓取视频帧以及录制视频。Android Studio是一款强大的集成开发环境,而JavaCV和OpenCV是两个关键的库,可以帮助开发者实现这些功能。本篇文章将深入...
在本项目中,Socket是Android手机与PC之间视频数据传输的基础,通过建立连接,发送和接收视频流。 "Android"是Google主导的开源移动操作系统,它的API提供了丰富的功能,包括网络通信,使得开发者能够构建这样的...
在Android平台上,Camera2 API是自Android 5.0(API级别21)引入的全新相机接口,旨在提供更高级别的控制和性能。这个API允许开发者深入到相机硬件的细节,实现专业级的拍照和视频录制功能。本文将详细介绍如何使用...
将VLC与OpenCV集成,可以实现实时从RTSP视频流中抓取帧并进行人脸检测。以下是一般步骤: 1. 使用VLC的Java或Native SDK在Android应用中建立RTSP视频流的连接和播放。 2. 定义一个回调函数,监听VLC播放器的视频帧...
在本教程中,我们将探讨如何利用OpenCV的JAVA接口通过RTMP(Real-Time Messaging Protocol)和RTSP(Real-Time Streaming Protocol)协议获取视频流,并进行人脸识别以及截图操作。 RTMP是一种用于在互联网上传输...
这个服务将在后台运行,不断抓取屏幕并编码为视频流。 4. **VideoEncoder**: 编码器是将屏幕画面转化为网络可传输格式的关键。Android提供了MediaCodec API,可以用来创建硬件加速的视频编码器,以高效地将每一帧...
在局域网环境中,RTSP常用于传输实时视频流,因为它可以提供低延迟的流媒体服务。 本文将详细介绍ijkplayer在Android中的应用、其核心特性以及如何实现录屏和截图功能。 一、IJKPlayer简介 IJKPlayer是FFmpeg的一...
这可能涉及使用Android的MediaCodec API进行解码和编码,以及SurfaceView或TextureView来显示视频流。此外,可能还需要使用HTTP Live Streaming (HLS) 或其他流媒体协议来获取和播放视频。 3. **弹幕系统**:弹幕...
通过V4L2,开发者可以控制摄像头参数,如分辨率、帧率,以及捕获视频流或静态图像。 1. **V4L2接口使用**: - 打开设备:在Android中,通常通过`/dev/videoX`设备文件来访问摄像头,X表示摄像头的编号。 - 设置...
在IT行业中,实时传输协议(RTSP)常用于视频流媒体传输,而h264是一种高效的视频编码标准。FFmpeg是一款强大的开源多媒体处理工具,能够处理多种格式的音频和视频,包括从RTSP流中提取和保存h264码流。下面将详细...
这一功能的实现涉及到Android的MediaRecorder类和SurfaceView,MediaRecorder用于处理音频和视频的捕获,而SurfaceView则用于显示视频流,为用户提供即时反馈。 其次,按时间回放和下载录像功能涉及到了文件管理...
码流通常指的是编码后的音频、视频或其他媒体数据在网络中的传输形式。 描述中提到,“手机抓包工具及说明 步骤等,有详细的说明哦,传上来是怕丢了,以备以后不时之需”,这表明这个压缩包可能包含了用于Android...
一旦连接成功,你需要获取监控视频的流数据并进行解码。海康SDK应该包含了解码视频流的函数,如`getVideoStream()`,将返回的数据流转换为可播放的帧。解码过程可能涉及到H.264、MJPEG等编码格式,这取决于你的监控...
在这个案例中,大华视频播放SDK包含了一系列针对Android平台优化的库文件,用于处理视频流解码、渲染以及用户交互。 **SDK主要功能:** 1. **视频播放**:SDK的核心功能是支持流畅的实时视频播放。它包含了必要的...
通常,开发者会创建一个DirectShow过滤器图形(Filter Graph)来管理视频流的处理过程,包括从摄像头获取数据、显示视频以及保存图像。 图像抓取功能是通过调用特定的DirectShow接口来实现的。例如,可以使用`...
标题中的“采集并基于 rtsp 协议推流摄像头(麦克风)数据,并在 web 浏览器渲染”指的是一个项目,它涉及了实时流传输协议(RTSP)、摄像头和麦克风的数据采集以及在Web浏览器中展示这些实时流数据的技术。...
`GLSurfaceView`是Android提供的一个用于渲染OpenGL ES图形的视图组件,而`Camera`则负责捕获设备的实时视频流。这个【Android】使用GLSurfaceView+Canera预览+保存帧Bitmap的项目,提供了一个完整的示例,让我们...
在项目HikVisionDemo-master中,开发者已经完成了大部分工作,包括设置SDK环境,建立设备连接,初始化播放器,以及将视频流渲染到Android SurfaceView上。为了实现截图功能,开发者可能已经实现了从SurfaceView抓取...
3. 数据捕获和分析:可以利用rtmpdump抓取流数据,进行内容分析、性能评估或者日志记录。 总的来说,"rtmpdump-2.3-android.zip"提供了一个在Android平台上处理RTMP流的强大工具,对于从事流媒体开发或者网络传输...