#java #android #video #recording
#java #Android #Видео #запись
Вопрос:
Может кто-нибудь сказать мне, как я могу использовать что-то вроде таймера для запуска процесса интервальной записи видео на определенный период времени (например, 5 минут), затем перезапускается для записи другого набора видео продолжительностью 5 минут, пока пользователь не вмешается, чтобы остановить процесс.. Я новичок в Android / Java, так что кто-нибудь может мне помочь с этим вопросом?
public class ServiceRecording extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
public static Camera ServiceCamera;
public static boolean recordingStatus;
@Override
public void onCreate() {
super.onCreate();
recordingStatus = false;
ServiceCamera = CameraTest.MainCamera;
surfaceView = CameraTest.surfaceView;
surfaceHolder = CameraTest.surfaceHolder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (recordingStatus == false)
startRecording();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
stopRecording();
//camera.stopPreview();
recordingStatus = false;
//camera.release();
}
private MediaRecorder mediaRecorder;
private static int encodingStatus;
private static String videoResolution;
private static String fileFormat;
private static boolean audioStatus;
private static int timeInterval;
private static final String TAG = "Exception";
public boolean startRecording(){
try {
encodingStatus = Tab1Activity.encodingPref;
videoResolution = Tab1Activity.videoResPref;
fileFormat = Tab1Activity.fileFormatPref;
audioStatus = Tab2Activity.audioPref;
timeInterval = Tab2Activity.timeIntervalPref;
Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show();
try{
ServiceCamera.reconnect();
ServiceCamera.unlock();
}
catch(Exception e){
}
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(ServiceCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setMaxDuration(timeInterval);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setVideoEncoder(encodingStatus);
//mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH_mm_ss");
Date date = new Date();
File dirlist = new File(Environment.getExternalStorageDirectory() "/VideoList");
if(!(dirlist.exists()))
dirlist.mkdir();
File TempFile = new File(Environment.getExternalStorageDirectory() "/VideoList", dateFormat.format(date) fileFormat);
mediaRecorder.setOutputFile(TempFile.getPath());
String[] separatedRes = videoResolution.split("x");
separatedRes[0];
separatedRes[1];
mediaRecorder.setVideoSize(surfaceView.getWidth(),surfaceView.getHeight());
//mediaRecorder.setVideoFrameRate(videoFramesPerSecond);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.prepare();
mediaRecorder.start();
recordingStatus = true;
return true;
}
catch (IllegalStateException e) {
Log.d(TAG,e.getMessage());
e.printStackTrace();
return false;
}
catch (IOException e) {
Log.d(TAG,e.getMessage());
e.printStackTrace();
return false;
}
}
public void stopRecording() {
Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show();
mediaRecorder.reset();
mediaRecorder.release();
recordingStatus = false;
}
}
Ответ №1:
Это позволит запускать и останавливать запись каждые 5 минут,
final ServiceRecording recording = ....
final AtomicBoolean started = new AtomicBoolean(false);
ScheduledExecutorService executor = Executors.newScheduledExecutor(1);
executor.scheduleAtFixedRate(new Runnable() {
public void run() {
//only stop if we have started
if(started.get()) {
recording.stop();
} else {
started.set(true);
}
recording.start();
}
}, 5, 5, TimeUnit.MINUTES);
Комментарии:
1. @sbridges Кажется, я все еще не понимаю, как реализовать вышеупомянутые коды в моем наборе кодов выше.. Извините, я новичок в Java / Android.. Не могли бы вы объяснить, где и как я должен внедрить приведенные выше коды в свой набор кода?? Спасибо 🙂
2. @Hakan Ozbay То есть вы имеете в виду, что просто скопируйте приведенные выше коды и поместите их в MediaRecorder.start(); и это будет просто работать без каких-либо изменений кода? Но «окончательная запись ServiceRecording = ….», как я должен это решить?
3. @Zack да. вы могли бы также сказать final ServiceRecording recording = MediaRecorder
4. @Hakan Ozbay после того, что вы рекомендовали, я заменил код MediaRecorder.start(); на приведенный выше упомянутый код, похоже, что в нем все еще есть всевозможные ошибки, такие как, например: «final ServiceRecording recording = MediaRecorder;», «Executors.newScheduledExecutor (1)», похоже, вообще не работает.. Что следует сделать, чтобы устранить эти ошибки??
5. @Hakan Ozbay я пытаюсь заменить окончательную сервисную запись на MediaRecorder.start(); и MediaRecorder.stop(); рекомендуется ли это? TimeUnit. МИНУТЫ, похоже, также выдают мне ошибку, похоже, что это не поддерживается в Android? Но я понятия не имею, как решить «Executors.newScheduledExecutor (1)»? Или есть лучший набор кода, чем приведенный выше, для выполнения записи с тем же интервалом?