`
iaiai
  • 浏览: 2205063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]Android中抓取手机视频流数据。

 
阅读更多
目前实时抓取手机视频数据有2种方法,一种是通过camera的回调获取源数据,这里获取的源数据是没有编码的数据。

有的人发送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();  
        }  
    }
}
分享到:
评论

相关推荐

    android studio javacv 播放rstp流、抓图、录制视频功能

    在Android开发中,有时我们需要处理实时视频流,例如播放RTSP流、抓取视频帧以及录制视频。Android Studio是一款强大的集成开发环境,而JavaCV和OpenCV是两个关键的库,可以帮助开发者实现这些功能。本篇文章将深入...

    基于Socket的Android手机视频实时传输所有源程序

    在本项目中,Socket是Android手机与PC之间视频数据传输的基础,通过建立连接,发送和接收视频流。 "Android"是Google主导的开源移动操作系统,它的API提供了丰富的功能,包括网络通信,使得开发者能够构建这样的...

    Android camera2预览和取数据

    在Android平台上,Camera2 API是自Android 5.0(API级别21)引入的全新相机接口,旨在提供更高级别的控制和性能。这个API允许开发者深入到相机硬件的细节,实现专业级的拍照和视频录制功能。本文将详细介绍如何使用...

    VLC for Android 基于 Opencv 对 RTSP视频 实时人脸检测

    将VLC与OpenCV集成,可以实现实时从RTSP视频流中抓取帧并进行人脸检测。以下是一般步骤: 1. 使用VLC的Java或Native SDK在Android应用中建立RTSP视频流的连接和播放。 2. 定义一个回调函数,监听VLC播放器的视频帧...

    opencv可通过rtmp/rtsp获取视频流人脸识别与并截图

    在本教程中,我们将探讨如何利用OpenCV的JAVA接口通过RTMP(Real-Time Messaging Protocol)和RTSP(Real-Time Streaming Protocol)协议获取视频流,并进行人脸识别以及截图操作。 RTMP是一种用于在互联网上传输...

    Android-Android屏幕共享共享你的屏幕和音频到另一台手机

    这个服务将在后台运行,不断抓取屏幕并编码为视频流。 4. **VideoEncoder**: 编码器是将屏幕画面转化为网络可传输格式的关键。Android提供了MediaCodec API,可以用来创建硬件加速的视频编码器,以高效地将每一帧...

    IJKPlayer Android 可录屏 可播放RTSP格式

    在局域网环境中,RTSP常用于传输实时视频流,因为它可以提供低延迟的流媒体服务。 本文将详细介绍ijkplayer在Android中的应用、其核心特性以及如何实现录屏和截图功能。 一、IJKPlayer简介 IJKPlayer是FFmpeg的一...

    Android-Android视频直播应用且配有弹幕显示内容均从斗鱼抓取。

    这可能涉及使用Android的MediaCodec API进行解码和编码,以及SurfaceView或TextureView来显示视频流。此外,可能还需要使用HTTP Live Streaming (HLS) 或其他流媒体协议来获取和播放视频。 3. **弹幕系统**:弹幕...

    android下v4l2拍摄jpg格式图片

    通过V4L2,开发者可以控制摄像头参数,如分辨率、帧率,以及捕获视频流或静态图像。 1. **V4L2接口使用**: - 打开设备:在Android中,通常通过`/dev/videoX`设备文件来访问摄像头,X表示摄像头的编号。 - 设置...

    利用ffmpeg将RTSP传输的h264原始码流保存到文件中

    在IT行业中,实时传输协议(RTSP)常用于视频流媒体传输,而h264是一种高效的视频编码标准。FFmpeg是一款强大的开源多媒体处理工具,能够处理多种格式的音频和视频,包括从RTSP流中提取和保存h264码流。下面将详细...

    大华Android视频录制demo

    这一功能的实现涉及到Android的MediaRecorder类和SurfaceView,MediaRecorder用于处理音频和视频的捕获,而SurfaceView则用于显示视频流,为用户提供即时反馈。 其次,按时间回放和下载录像功能涉及到了文件管理...

    手机抓包工具android 抓码流

    码流通常指的是编码后的音频、视频或其他媒体数据在网络中的传输形式。 描述中提到,“手机抓包工具及说明 步骤等,有详细的说明哦,传上来是怕丢了,以备以后不时之需”,这表明这个压缩包可能包含了用于Android...

    Android预览监控视频

    一旦连接成功,你需要获取监控视频的流数据并进行解码。海康SDK应该包含了解码视频流的函数,如`getVideoStream()`,将返回的数据流转换为可播放的帧。解码过程可能涉及到H.264、MJPEG等编码格式,这取决于你的监控...

    Android端大华视频播放SDK,包括开发Demo

    在这个案例中,大华视频播放SDK包含了一系列针对Android平台优化的库文件,用于处理视频流解码、渲染以及用户交互。 **SDK主要功能:** 1. **视频播放**:SDK的核心功能是支持流畅的实时视频播放。它包含了必要的...

    摄像头视频播放,图像抓取

    通常,开发者会创建一个DirectShow过滤器图形(Filter Graph)来管理视频流的处理过程,包括从摄像头获取数据、显示视频以及保存图像。 图像抓取功能是通过调用特定的DirectShow接口来实现的。例如,可以使用`...

    采集并基于 rtsp 协议推流摄像头(麦克风)数据,并在 web 浏览器渲染。.zip

    标题中的“采集并基于 rtsp 协议推流摄像头(麦克风)数据,并在 web 浏览器渲染”指的是一个项目,它涉及了实时流传输协议(RTSP)、摄像头和麦克风的数据采集以及在Web浏览器中展示这些实时流数据的技术。...

    【Android】使用GLSurfaceView+Canera预览+保存帧Bitmap

    `GLSurfaceView`是Android提供的一个用于渲染OpenGL ES图形的视图组件,而`Camera`则负责捕获设备的实时视频流。这个【Android】使用GLSurfaceView+Canera预览+保存帧Bitmap的项目,提供了一个完整的示例,让我们...

    android 海康威视实时预览 截图

    在项目HikVisionDemo-master中,开发者已经完成了大部分工作,包括设置SDK环境,建立设备连接,初始化播放器,以及将视频流渲染到Android SurfaceView上。为了实现截图功能,开发者可能已经实现了从SurfaceView抓取...

    rtmpdump-2.3-android.zip_ rtmpdump andro_android_android librtmp

    3. 数据捕获和分析:可以利用rtmpdump抓取流数据,进行内容分析、性能评估或者日志记录。 总的来说,"rtmpdump-2.3-android.zip"提供了一个在Android平台上处理RTMP流的强大工具,对于从事流媒体开发或者网络传输...

Global site tag (gtag.js) - Google Analytics