You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
FFmpegAndroid/Live/src/main/java/com/frank/live/PushActivity.java

308 lines
9.8 KiB

package com.frank.live;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import androidx.annotation.NonNull;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import com.frank.live.view.SmartCameraView;
import com.seu.magicfilter.utils.MagicFilterType;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
public class PushActivity extends Activity implements Callback {
private static String TAG = PushActivity.class.getSimpleName();
private SmartCameraView mSmartCameraView;
// MagicFilterType magicType = MagicFilterType.SUNRISE;
private Button btnMute;
private boolean isStart = false;
private boolean is_mute = false;
private int mDegree;
private Spinner beautyTypeSelector;
private ImageView img_photo;
private boolean takePhoto;
private final static int videoWidth = 640;
private final static int videoHeight = 360;
private final static String[] permissions = new String[]{Manifest.permission.CAMERA};
private final static int CODE_CAMERA = 1001;
private final static String[] beautySelector = new String[]{
LiveApplication.getInstance().getString(R.string.effect_beauty),
LiveApplication.getInstance().getString(R.string.effect_cool),
LiveApplication.getInstance().getString(R.string.effect_sunrise),
LiveApplication.getInstance().getString(R.string.effect_sketch),
LiveApplication.getInstance().getString(R.string.effect_white),
LiveApplication.getInstance().getString(R.string.effect_romantic),
LiveApplication.getInstance().getString(R.string.effect_raw)
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermissions();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_push);
initView();
initListener();
}
@TargetApi(23)
private void requestPermissions() {
requestPermissions(permissions, CODE_CAMERA);
}
private void initView() {
//SurfaceView
mSmartCameraView = findViewById(R.id.gl_surfaceview);
//beauty type
beautyTypeSelector = findViewById(R.id.beauty_type_selector);
//mute
btnMute = findViewById(R.id.button_mute);
//take photo
img_photo = findViewById(R.id.img_photo);
}
private void initListener() {
ArrayAdapter<String> adapterBeautyType = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, beautySelector);
adapterBeautyType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
beautyTypeSelector.setAdapter(adapterBeautyType);
beautyTypeSelector.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
switchCameraFilter(MagicFilterType.BEAUTY);
break;
case 1:
switchCameraFilter(MagicFilterType.COOL);
break;
case 2:
switchCameraFilter(MagicFilterType.SUNRISE);
break;
case 3:
switchCameraFilter(MagicFilterType.SKETCH);
break;
case 4:
switchCameraFilter(MagicFilterType.WHITECAT);
break;
case 5:
switchCameraFilter(MagicFilterType.ROMANCE);
break;
default:
switchCameraFilter(MagicFilterType.NONE);
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
btnMute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
is_mute = !is_mute;
if (is_mute) {
btnMute.setText(getString(R.string.voice));
} else {
btnMute.setText(getString(R.string.mute));
}
}
});
//preview data callback(RGBA)
mSmartCameraView.setPreviewCallback(new SmartCameraView.PreviewCallback() {
@Override
public void onGetRgbaFrame(byte[] data, int width, int height) {
if (takePhoto) {
takePhoto = false;
Log.i(TAG, "takePhoto...");
doTakePhoto(data, width, height);
}
}
});
img_photo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
takePhoto = true;
}
});
}
private void switchCameraFilter(MagicFilterType type) {
mSmartCameraView.setFilter(type);
}
/**
* take photo
*
* @param data preview data
* @param width the width of photo
* @param height the height of photo
*/
private void doTakePhoto(byte[] data, int width, int height) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
ByteBuffer buffer = ByteBuffer.wrap(data);
bitmap.copyPixelsFromBuffer(buffer);
Log.i(TAG, "doTakePhoto...");
FileOutputStream fileOutputStream = null;
String PATH = Environment.getExternalStorageDirectory().getPath();
String filePath = PATH + File.separator + "hello" + ".jpg";
try {
fileOutputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "doTakePhoto error=" + e.toString());
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated..");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.i(TAG, "surfaceChanged..");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "Surface Destroyed");
}
public void onConfigurationChanged(Configuration newConfig) {
try {
super.onConfigurationChanged(newConfig);
Log.i(TAG, "onConfigurationChanged, start:" + isStart);
setCameraDisplayOrientation(this, getCameraId());
mSmartCameraView.setPreviewOrientation(newConfig.orientation, mDegree);
} catch (Exception ex) {
Log.e(TAG, "error=" + ex.toString());
}
}
private int getCameraId() {
return mSmartCameraView.getCameraId();
}
public void setPreviewResolution(int width, int height) {
mSmartCameraView.setPreviewResolution(width, height);
}
private void setCameraDisplayOrientation(Activity activity, int cameraId) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
// back-facing
result = (info.orientation - degrees + 360) % 360;
}
Log.i(TAG, "curDegree: " + result);
mDegree = result;
}
@Override
protected void onDestroy() {
if (isStart) {
isStart = false;
if (mSmartCameraView != null) {
mSmartCameraView.stopCamera();
}
Log.i(TAG, "onDestroy StopPublish");
}
super.onDestroy();
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissions.length > 0 && grantResults.length > 0) {
setPreviewResolution(videoWidth, videoHeight);
if (!mSmartCameraView.startCamera()) {
Log.e(TAG, "startCamera error...");
}
}
}
}