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;
}
}