视频采集

15 篇文章 0 订阅

1、

MainAcitivity:

package com.dongnaoedu.live;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;

import com.dongnaoedu.live.pusher.LivePusher;

public class MainActivity extends AppCompatActivity {


    private LivePusher live;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
        //相机图像的预览
        live = new LivePusher(surfaceView.getHolder());
    }

    /**
     * 开始直播
     * @param
     */
    public void mStartLive(View view) {
    }

    /**
     * 切换摄像头
     * @param btn
     */
    public void mSwitchCamera(View btn) {
        live.switchCamera();
    }
}

activity_main:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.view.SurfaceView
        android:id="@+id/surface"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <LinearLayout
        android:id="@+id/adcontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_push"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:onClick="mStartLive"
            android:text="开始直播"/>

        <Button
            android:id="@+id/btn_camera_switch"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="切换摄像头"
            android:onClick="mSwitchCamera"/>
    </LinearLayout>

</RelativeLayout>

2、LivePusher:

package com.dongnaoedu.live.pusher;


import android.hardware.Camera.CameraInfo;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;

import com.dongnaoedu.live.params.VideoParams;

public class LivePusher {

	private SurfaceHolder surfaceHolder;
	private VideoPusher videoPusher;

	public LivePusher(SurfaceHolder surfaceHolder) {
		this.surfaceHolder = surfaceHolder;
		prepare();
	}

	/**
	 * 预览准备
	 */
	private void prepare() {
		//实例化音频推流器
//		VideoParams videoParams = new VideoParams(480,320,CameraInfo.CAMERA_FACING_BACK);
		VideoParams videoParams = new VideoParams(1080,1920,CameraInfo.CAMERA_FACING_BACK);
		videoPusher = new VideoPusher(surfaceHolder,videoParams);

		AudioPusher audioPusher = new AudioPusher();
	}


	/**
	 * 切换摄像头
	 */
	public void switchCamera(){
		videoPusher.switchCamera();
	}

	
}

 

3、视频采集:

package com.dongnaoedu.live.pusher;


import android.hardware.Camera;
import android.view.SurfaceHolder;

import com.dongnaoedu.live.params.VideoParams;

import java.io.IOException;

public class VideoPusher extends Pusher implements SurfaceHolder.Callback, Camera.PreviewCallback {

	private Camera mCamera;
	private SurfaceHolder surfaceHolder;
	private VideoParams videoParams;
	private byte[] buffers;
	private boolean isPushing = false;

	public VideoPusher(SurfaceHolder surfaceHolder, VideoParams videoParams){
		this.surfaceHolder = surfaceHolder;
		this.videoParams = videoParams;
		surfaceHolder.addCallback(this);
	}


	@Override
	public void startPush() {
		isPushing  = true;
	}

	@Override
	public void stopPush() {
		isPushing  = false;
	}

	@Override
	public void release() {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		startPreview();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
	}

	/**
	 * 开始预览
	 */
	private void startPreview() {
		try {
			//SurfaceView初始化完成,开始相机预览
			mCamera = Camera.open(videoParams.getCameraId());
			mCamera.setPreviewDisplay(surfaceHolder);
			//获取预览图像数据
			buffers = new byte[videoParams.getWidth() * videoParams.getHeight() * 4];
			mCamera.addCallbackBuffer(buffers);
			mCamera.setPreviewCallbackWithBuffer(this);

			mCamera.startPreview();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 停止预览
	 */
	private void stopPriview(){
		if(mCamera != null){
			mCamera.stopPreview();
			mCamera.release();
			mCamera = null;
		}
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {

	}

	/**
	 * 切换摄像头
	 */
	public void switchCamera(){
		if(videoParams.getCameraId() == Camera.CameraInfo.CAMERA_FACING_FRONT){
			videoParams.setCameraId(Camera.CameraInfo.CAMERA_FACING_BACK);
		}else {
			videoParams.setCameraId(Camera.CameraInfo.CAMERA_FACING_FRONT);
		}
		stopPriview();
		startPreview();
	}


	@Override
	public void onPreviewFrame(byte[] data, Camera camera) {
		if(mCamera != null){
			mCamera.addCallbackBuffer(buffers);
		}

		//回调函数中获取图像数据,然后给Native代码编码
		System.out.println("onPreviewFrame...............................");
	}
}

 

 

4、

package com.dongnaoedu.live.pusher;

public abstract class Pusher {

	public abstract void startPush();
	
	public abstract void stopPush();
	
	public abstract void release();
	
}

 

5、参数列表:

package com.dongnaoedu.live.params;

/**
 * 视频数据参数
 */
public class VideoParams {

    private int width;
    private int height;
    private int cameraId;

    public VideoParams(int width, int height, int cameraId) {
        this.width = width;
        this.height = height;
        this.cameraId = cameraId;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getCameraId() {
        return cameraId;
    }

    public void setCameraId(int cameraId) {
        this.cameraId = cameraId;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值