рдПрдВрдбреНрд░реЙрдЗрдб рдХреИрдорд░рд╛ 2 рдЪрд╛рдпрджрд╛рдиреА рд╕реЗ рдПрдкреАрдЖрдИ, рднрд╛рдЧ 2, рдПрдХ рд╡реАрдбрд┐рдпреЛ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ



рд╣рдо CAMERA2 Android API рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдирдП API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдорд░реЗ рдХреЛ рдлрд╝реЛрдЯреЛ рд▓реЗрдиреЗ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреАред рдЕрдм рдПрдХ рд╡реАрдбрд┐рдпреЛ рд▓реЗрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢реБрд░реВ рдореЗрдВ, рдореЗрд░рд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдореАрдбрд┐рдпрд╛ рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдХреИрдорд░рд╛ рд╕реЗ рд▓рд╛рдЗрд╡ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдкрд╣рд▓реЗ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЛ рджреГрд╢реНрдп рдкрд░ рдорд┐рд▓рд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕рдореНрдорд╛рдирд┐рдд рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╡рд╣ рд╡реАрдбрд┐рдпреЛ рдХреНрд▓рд┐рдк рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдирдП рдПрдкреАрдЖрдИ рдореЗрдВ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдкреЛрд╕реНрдЯ рдмрд╣реБрдд рд╣реА рд╢рд╛рдирджрд╛рд░ рдирд┐рдХрд▓рд╛, рдЗрд╕рд▓рд┐рдП рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрддреА рдФрд░ рдкрд░рдлреЗрдХреНрдЯ рдЯреАрдкреЛрдЯреНрд╕ рд╣реА рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред



рддреЛ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░



рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╣реБрдд рдирд╛рдо рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЪрд┐рддреНрд░ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдСрдбрд┐рдпреЛ рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ, рдпрд╣ рд╕рдм рд╡рд╛рдВрдЫрд┐рдд рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕реБрд▓рдн рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реИ, рд╣рдо рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ MPEG_4 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреЗрд░реЗрд░реНрд╡реЗрдЯреНрд╕ рдиреЗ рдлрд╛рдЗрд▓ рдХреЗ рдмрдЬрд╛рдп рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЙрдХреЗрдЯ рдЦрд┐рд╕рдХрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпреЗ рдЧреБрдлрд╛ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВред рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреНрдп рдореАрдбрд┐рдпрд╛ рдХреЛрдбреЗрдХ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ 2011 рд╕реЗ рдкрд┐рдЫрд▓реЗ рдХреИрдорд░рд╛ рдПрдкреАрдЖрдИ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ, рддрдм MediaRecorder рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╕реБрдЦрдж рд╣реИ рдХрд┐ рдЕрдм рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╣рдореЗрдВ рдХреИрдорд░реЗ рдХреА рдкреВрд░реА рдпреЛрдЬрдирд╛ рдХреА рддрд╕реНрд╡реАрд░ рд╕реЗ рдбрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред



рд╣рдореЗрдВ рдмрд╕ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЛ рднреВрддрд▓ рдХреА рд╕рддрд╣ рдкрд░ рдЬрдХрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдХреИрдорд░реЗ рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЦреБрдж рдХрд░реЗрдЧрд╛ред рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде, рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рддреБрдЪреНрдЫ рд╣реИ, рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рд╣рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рдкрд░реЗрд╢рд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдирд┐рдХрд╛рд▓ рджреЗрдЧрд╛ред

рдпрд╛рдж рдХреАрдЬрд┐рдП рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ рдЬрд╛рдкрд╛рдиреА рджреЛрд╕реНрдд рдХрд┐рддрдирд╛ рд╣реИрд░рд╛рди:

рдХреИрдорд░рд╛ 2 рдХреЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╢реЙрдЯ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рддрдиреЗ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдФрд░ рдпрд╣рд╛рдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛред рдЬреИрд╕рд╛ рдХрд┐ рдЬрд╝реЗрдореНрдлрд┐рд░рд╛ рдЧрд╛рддреА рд╣реИ: "рдореБрдЭреЗ рдЖрдкрдХреЗ рдХреЙрд▓рдмреИрдХ рдХреА рд╕рдмрд╕реЗ рдХрдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред"

рдФрд░ рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ

рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлреЛрдЯреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдХреИрдорд░реЗ рдХрд╛ рд╕рдВрдХрд▓реНрдк рдФрд░ рдЖрд░рдВрднреАрдХрд░рдгред рд╣рдо рднреА рдХреЗрд╡рд▓ рдПрдХ рдХреИрдорд░рд╛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╕рд╛рдордиреЗред

private CameraManager mCameraManager = null; private final int CAMERA1 = 0; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(LOG_TAG, " "); if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) ) { requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1); } mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { //      myCameras = new CameraService[mCameraManager.getCameraIdList().length]; for (String cameraID : mCameraManager.getCameraIdList()) { Log.i(LOG_TAG, "cameraID: " + cameraID); int id = Integer.parseInt(cameraID); //     myCameras[id] = new CameraService(mCameraManager, cameraID); } } catch (CameraAccessException e) { Log.e(LOG_TAG, e.getMessage()); e.printStackTrace(); } public class CameraService { private String mCameraID; private CameraDevice mCameraDevice = null; private CameraCaptureSession mSession; private CaptureRequest.Builder mPreviewBuilder; public CameraService(CameraManager cameraManager, String cameraID) { mCameraManager = cameraManager; mCameraID = cameraID; } private CameraDevice.StateCallback mCameraCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCameraDevice = camera; Log.i(LOG_TAG, "Open camera with id:" + mCameraDevice.getId()); //startCameraPreviewSession();        Media Recorder } @Override public void onDisconnected(CameraDevice camera) { mCameraDevice.close(); Log.i(LOG_TAG, "disconnect camera with id:" + mCameraDevice.getId()); mCameraDevice = null; } @Override public void onError(CameraDevice camera, int error) { Log.i(LOG_TAG, "error! camera id:" + camera.getId() + " error:" + error); } }; 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, RECORD_AUDIO рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдзреНрд╡рдирд┐ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдирдВрдЧреЗ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рдЕрднреА рднреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ рдзреНрд╡рдирд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдзреНрд╡рдирд┐ рдФрд░ рд╕рд╛рдорд╛рди рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ, рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдбреЗрдореЛ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ

  private void setUpMediaRecorder() { mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mCurrentFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "test"+count+".mp4"); mMediaRecorder.setOutputFile(mCurrentFile.getAbsolutePath()); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); mMediaRecorder.setVideoFrameRate(profile.videoFrameRate); mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); mMediaRecorder.setAudioSamplingRate(profile.audioSampleRate); try { mMediaRecorder.prepare(); Log.i(LOG_TAG, "   "); } catch (Exception e) { Log.i(LOG_TAG, "   "); } } 


рдпрд╣рд╛рдБ рднреА, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░рдг рдЖрддрд╛ рд╣реИ - рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЛ рд╕рд░рдлреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ред рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдордиреЗ рдХреИрдорд░реЗ рд╕реЗ рд╕рддрд╣ рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдФрд░ рдЫрд╡рд┐ рд░реАрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдлреНрд░реЗрдо рд╢реВрдЯ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдмрд╕ рд╕рд░рдлреЗрд╕ рд╕реВрдЪреА рдореЗрдВ рджреЛрдиреЛрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ред

 Arrays.asList(surface,mImageReader.getSurface()) 


рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдмрд╛рдд, рдХреЗрд╡рд▓ ImageReader рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 (Arrays.asList(surface, mMediaRecorder.getSurface()). 


рд╡рд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдХреБрдЫ рднреА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореАрдбрд┐рдпрд╛ рдХреЛрдбреЗрдХ рдХреЛ рднреА рдореВрд░реНрддрд┐рдХрд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдЖрдк рдПрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдлреЛрдЯреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реАрдбрд┐рдпреЛ рд╢реВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рддрд╣ рдЕрдЪреНрдЫрд╛ - рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдХреНрдпрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреИрдорд░реЗ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред




рдпрд╣, рдЬреИрд╕реЗ, рд╡рд┐рднрд┐рдиреНрди рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдмрд╕ рдмрд┐рдЦреЗрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИред

рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рдореАрдбрд┐рдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП

рд▓рдЧрднрдЧ рд╣рдордиреЗ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рдлреЛрдЯреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдореЗрдВ рд╢реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдЗрдореЗрдЬрд╕реЗрд╡рд░ рдХреЗ рдХрд┐рд╕реА рднреА рдПрдирд╛рд▓реЙрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдорд╛рд░рд╛ рд╣рд╛рд░реНрдб-рд╡рд░реНрдХрд┐рдВрдЧ рд░рд┐рдХреЙрд░реНрдбрд░ рд╕рдм рдХреБрдЫ рдЦреБрдж рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдирддреАрдЬрддрди, рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдиреНрдпреВрдирддрдо рд░реВрдк рд▓реЗрддрд╛ рд╣реИред

 package com.example.mediarecorder1; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest; import android.media.CamcorderProfile; import android.os.Bundle; import android.media.MediaRecorder; import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Button; import java.io.File; import java.util.Arrays; public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = "myLogs"; CameraService[] myCameras = null; private CameraManager mCameraManager = null; private final int CAMERA1 = 0; private int count =1; private Button mButtonOpenCamera1 = null; private Button mButtonRecordVideo = null; private Button mButtonStopRecordVideo = null; public static TextureView mImageView = null; private HandlerThread mBackgroundThread; private Handler mBackgroundHandler = null; private File mCurrentFile; private MediaRecorder mMediaRecorder = null; private void startBackgroundThread() { mBackgroundThread = new HandlerThread("CameraBackground"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } private void stopBackgroundThread() { mBackgroundThread.quitSafely(); try { mBackgroundThread.join(); mBackgroundThread = null; mBackgroundHandler = null; } catch (InterruptedException e) { e.printStackTrace(); } } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(LOG_TAG, " "); if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) ) { requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1); } mButtonOpenCamera1 = findViewById(R.id.button1); mButtonRecordVideo = findViewById(R.id.button2); mButtonStopRecordVideo = findViewById(R.id.button3); mImageView = findViewById(R.id.textureView); mButtonOpenCamera1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (myCameras[CAMERA1] != null) { if (!myCameras[CAMERA1].isOpen()) myCameras[CAMERA1].openCamera(); } } }); mButtonRecordVideo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if ((myCameras[CAMERA1] != null) & mMediaRecorder != null) { mMediaRecorder.start(); } } }); mButtonStopRecordVideo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if ((myCameras[CAMERA1] != null) & (mMediaRecorder != null)) { myCameras[CAMERA1].stopRecordingVideo(); } } }); mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { //      myCameras = new CameraService[mCameraManager.getCameraIdList().length]; for (String cameraID : mCameraManager.getCameraIdList()) { Log.i(LOG_TAG, "cameraID: " + cameraID); int id = Integer.parseInt(cameraID); //     myCameras[id] = new CameraService(mCameraManager, cameraID); } } catch (CameraAccessException e) { Log.e(LOG_TAG, e.getMessage()); e.printStackTrace(); } setUpMediaRecorder(); } private void setUpMediaRecorder() { mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mCurrentFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "test"+count+".mp4"); mMediaRecorder.setOutputFile(mCurrentFile.getAbsolutePath()); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); mMediaRecorder.setVideoFrameRate(profile.videoFrameRate); mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); mMediaRecorder.setAudioSamplingRate(profile.audioSampleRate); try { mMediaRecorder.prepare(); Log.i(LOG_TAG, "   "); } catch (Exception e) { Log.i(LOG_TAG, "   "); } } public class CameraService { private String mCameraID; private CameraDevice mCameraDevice = null; private CameraCaptureSession mSession; private CaptureRequest.Builder mPreviewBuilder; public CameraService(CameraManager cameraManager, String cameraID) { mCameraManager = cameraManager; mCameraID = cameraID; } private CameraDevice.StateCallback mCameraCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCameraDevice = camera; Log.i(LOG_TAG, "Open camera with id:" + mCameraDevice.getId()); startCameraPreviewSession(); } @Override public void onDisconnected(CameraDevice camera) { mCameraDevice.close(); Log.i(LOG_TAG, "disconnect camera with id:" + mCameraDevice.getId()); mCameraDevice = null; } @Override public void onError(CameraDevice camera, int error) { Log.i(LOG_TAG, "error! camera id:" + camera.getId() + " error:" + error); } }; private void startCameraPreviewSession() { SurfaceTexture texture = mImageView.getSurfaceTexture(); texture.setDefaultBufferSize(640, 480); Surface surface = new Surface(texture); try { mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); /**Surface for the camera preview set up*/ mPreviewBuilder.addTarget(surface); /**MediaRecorder setup for surface*/ Surface recorderSurface = mMediaRecorder.getSurface(); mPreviewBuilder.addTarget(recorderSurface); mCameraDevice.createCaptureSession(Arrays.asList(surface, mMediaRecorder.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mSession = session; try { mSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { } }, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } public void stopRecordingVideo() { try { mSession.stopRepeating(); mSession.abortCaptures(); mSession.close(); } catch (CameraAccessException e) { e.printStackTrace(); } mMediaRecorder.stop(); mMediaRecorder.release(); count++; setUpMediaRecorder(); startCameraPreviewSession(); } public boolean isOpen() { if (mCameraDevice == null) { return false; } else { return true; } } public void openCamera() { try { if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { mCameraManager.openCamera(mCameraID, mCameraCallback, mBackgroundHandler); } } catch (CameraAccessException e) { Log.i(LOG_TAG, e.getMessage()); } } } @Override public void onPause() { stopBackgroundThread(); super.onPause(); } @Override public void onResume() { super.onResume(); startBackgroundThread(); } } 


рдЗрд╕реЗ LAYOUT рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextureView android:id="@+id/textureView" android:layout_width="356dp" android:layout_height="410dp" android:layout_marginTop="32dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.49" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <LinearLayout android:layout_width="292dp" android:layout_height="145dp" android:layout_marginStart="16dp" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textureView" app:layout_constraintVertical_bias="0.537"> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " /> <Button android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> 






рдФрд░ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд

 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 


рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдореВрд░реНрдЦ рд╕реЗ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдСрди-рд╕реНрдХреНрд░реАрди рдмрдЯрди рдкреНрд░рд╣рд╛рд░ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИ, рддреЛ рдЖрдк рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi471774/


All Articles