修复多通道的bug

serial
BlueMatthew 1 year ago
parent 6385d4f247
commit 6c4c94b935

@ -20,6 +20,7 @@ import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.CamcorderProfile;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Bundle; import android.os.Bundle;
@ -96,7 +97,7 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
INVERSE_ORIENTATIONS.append(Surface.ROTATION_270, 0); INVERSE_ORIENTATIONS.append(Surface.ROTATION_270, 0);
} }
private String mCameraId; private int mCameraId;
private long mVideoId = 0; private long mVideoId = 0;
private int mDuration = 0; private int mDuration = 0;
@ -350,7 +351,7 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
Bundle argument = getArguments(); Bundle argument = getArguments();
if (argument != null) { if (argument != null) {
mCameraId = Integer.toString(argument.getInt("CameraId", 0)); mCameraId = argument.getInt("cameraId", 0);
mVideoId = argument.getLong("videoId", 0); mVideoId = argument.getLong("videoId", 0);
mDuration = argument.getInt("duration", 0); mDuration = argument.getInt("duration", 0);
int width = argument.getInt("width", 0); int width = argument.getInt("width", 0);
@ -491,10 +492,8 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("Time out waiting to lock camera opening."); throw new RuntimeException("Time out waiting to lock camera opening.");
} }
String cameraId = manager.getCameraIdList()[0];
// Choose the sizes for camera preview and video recording // Choose the sizes for camera preview and video recording
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); CameraCharacteristics characteristics = manager.getCameraCharacteristics(Integer.toString(mCameraId));
StreamConfigurationMap map = characteristics StreamConfigurationMap map = characteristics
.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
@ -514,7 +513,7 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
configureTransform(width, height); configureTransform(width, height);
mMediaRecorder = new MediaRecorder(); mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOnInfoListener(this); mMediaRecorder.setOnInfoListener(this);
manager.openCamera(cameraId, mStateCallback, null); manager.openCamera(Integer.toString(mCameraId), mStateCallback, null);
} catch (CameraAccessException e) { } catch (CameraAccessException e) {
// Toast.makeText(activity, "Cannot access the camera.", Toast.LENGTH_SHORT).show(); // Toast.makeText(activity, "Cannot access the camera.", Toast.LENGTH_SHORT).show();
activity.finish(); activity.finish();
@ -639,11 +638,33 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
mTextureView.setTransform(matrix); mTextureView.setTransform(matrix);
} }
public static int videoSizeToQuality(int width, int height) {
int quality = CamcorderProfile.QUALITY_480P;
if (height >= 1080) {
quality = CamcorderProfile.QUALITY_1080P;
} else if (height >= 720) {
quality = CamcorderProfile.QUALITY_720P;
} else if (height >= 480) {
quality = (width > 640) ? CamcorderProfile.QUALITY_480P : CamcorderProfile.QUALITY_VGA;
} else if (height >= 240) {
quality = CamcorderProfile.QUALITY_QVGA;
}
return quality;
}
private void setUpMediaRecorder() throws IOException { private void setUpMediaRecorder() throws IOException {
final Activity activity = getActivity(); final Activity activity = getActivity();
if (null == activity) { if (null == activity) {
return; return;
} }
CamcorderProfile camcorderProfile = null;
int quality = videoSizeToQuality(mVideoSize.getWidth(), mVideoSize.getHeight());
if (CamcorderProfile.hasProfile(mCameraId, quality)) {
camcorderProfile = CamcorderProfile.get(mCameraId, quality);
}
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
@ -651,8 +672,9 @@ public class VideoFragment extends Fragment implements View.OnClickListener, Med
mNextVideoAbsolutePath = getVideoFilePath(getActivity()); mNextVideoAbsolutePath = getVideoFilePath(getActivity());
} }
mMediaRecorder.setOutputFile(mNextVideoAbsolutePath); mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
mMediaRecorder.setVideoEncodingBitRate(1024 * 1024 * 8); mMediaRecorder.setVideoEncodingBitRate(camcorderProfile != null ? camcorderProfile.videoBitRate : (1024 * 1024 * 16));
mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setCaptureRate(camcorderProfile != null ? camcorderProfile.videoFrameRate : 30);
mMediaRecorder.setVideoFrameRate(camcorderProfile != null ? camcorderProfile.videoFrameRate : 30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight()); mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

Loading…
Cancel
Save