1
1
package com .fpvout .digiview .dvr ;
2
2
3
- import android .Manifest ;
4
3
import android .app .Activity ;
5
4
import android .media .MediaRecorder ;
6
5
import android .os .Environment ;
7
- import android .os .Looper ;
8
6
import android .util .Log ;
9
7
import android .widget .ImageButton ;
10
8
import android .widget .Toast ;
11
9
12
- import com .fpvout .digiview .InputStreamDataSource ;
13
10
import com .fpvout .digiview .R ;
14
11
import com .fpvout .digiview .VideoReaderExoplayer ;
15
- import com .fpvout .digiview .helpers .Mp4Muxer ;
16
- import com .fpvout .digiview .helpers .ThreadPerTaskExecutor ;
17
-
18
- import org .mp4parser .Container ;
19
- import org .mp4parser .muxer .DataSource ;
20
- import org .mp4parser .muxer .FileDataSourceImpl ;
21
- import org .mp4parser .muxer .Movie ;
22
- import org .mp4parser .muxer .builder .DefaultMp4Builder ;
23
- import org .mp4parser .muxer .tracks .AACTrackImpl ;
24
- import org .mp4parser .muxer .tracks .h264 .H264TrackImpl ;
25
-
26
- import java .io .ByteArrayOutputStream ;
12
+ import com .fpvout .digiview .helpers .StreamDumper ;
13
+
27
14
import java .io .File ;
28
- import java .io .FileNotFoundException ;
29
- import java .io .FileOutputStream ;
30
15
import java .io .IOException ;
31
- import java .io .OutputStream ;
32
- import java .util .Date ;
33
-
34
- import androidx .core .app .ActivityCompat ;
35
- import usb .AndroidUSBOutputStream ;
16
+ import java .text .SimpleDateFormat ;
17
+ import java .util .Calendar ;
36
18
37
19
public class DVR {
38
20
private static final int WRITE_EXTERNAL_STORAGE = 0 ;
39
- private final Activity _activity ;
40
- private boolean _recordAmbientAudio ;
41
- private MediaRecorder _recorder ;
21
+ private final Activity activity ;
22
+ private boolean recordAmbientAudio ;
23
+ private MediaRecorder recorder ;
42
24
private boolean recording = false ;
43
25
private static DVR instance ;
44
26
private static final String DVR_LOG_TAG = "DVR" ;
45
27
private String defaultFolder = "" ;
46
- private String _ambietAudio ;
47
- private String _videoFile ;
48
- private String _dvrFile ;
49
- private VideoReaderExoplayer _mPlayer ;
28
+ private String ambietAudio ;
29
+ private String videoFile ;
30
+ private String dvrFile ;
31
+ private VideoReaderExoplayer mPlayer ;
50
32
private File dvrTmpFile ;
51
33
private String fileName ;
52
- private AndroidUSBOutputStream dvrOutputStream ;
34
+ private StreamDumper streamDumper ;
53
35
54
36
DVR (Activity activity , boolean recordAmbientAudio ){
55
- _activity = activity ;
56
- _recordAmbientAudio = recordAmbientAudio ;
57
- defaultFolder = Environment .getExternalStorageDirectory ().getAbsolutePath ()+ "/" +_activity .getApplicationInfo ().loadLabel (_activity .getPackageManager ()).toString ();
58
- ActivityCompat .requestPermissions (_activity , new String []{Manifest .permission .READ_EXTERNAL_STORAGE , Manifest .permission .WRITE_EXTERNAL_STORAGE , Manifest .permission .RECORD_AUDIO , Manifest .permission .CAMERA }, WRITE_EXTERNAL_STORAGE );
59
-
37
+ this .activity = activity ;
38
+ this .recordAmbientAudio = recordAmbientAudio ;
39
+ defaultFolder = Environment .getExternalStoragePublicDirectory (Environment .DIRECTORY_PICTURES ) + "/" + this .activity .getApplicationInfo ().loadLabel (this .activity .getPackageManager ()).toString ();
40
+ streamDumper = new StreamDumper (activity , defaultFolder );
60
41
}
61
42
62
43
public static DVR getInstance (Activity context , boolean recordAmbientAudio ){
@@ -67,60 +48,55 @@ public static DVR getInstance(Activity context, boolean recordAmbientAudio){
67
48
}
68
49
69
50
public void init (VideoReaderExoplayer mPlayer ) throws IOException {
70
- this ._mPlayer = mPlayer ;
51
+ this .mPlayer = mPlayer ;
71
52
72
- _recorder = new MediaRecorder ();
73
- _recorder .setAudioSource (MediaRecorder .AudioSource .MIC );
74
- _recorder .setOutputFormat (MediaRecorder .OutputFormat .AAC_ADTS );
75
- _recorder .setAudioEncoder (MediaRecorder .AudioEncoder .AAC );
53
+ recorder = new MediaRecorder ();
54
+ recorder .setAudioSource (MediaRecorder .AudioSource .MIC );
55
+ recorder .setOutputFormat (MediaRecorder .OutputFormat .AAC_ADTS );
56
+ recorder .setAudioEncoder (MediaRecorder .AudioEncoder .AAC );
76
57
}
77
58
78
59
public void recordVideoDVR (byte [] buffer , int offset , int readLength ) {
79
60
if (isRecording ()) {
80
- try {
81
- if (dvrTmpFile != null ) {
82
- dvrOutputStream .write (buffer , offset , readLength );
83
- }
84
- } catch (Exception e ) {
85
- e .printStackTrace ();
86
- }
61
+ streamDumper .dump ( buffer , offset , readLength );
87
62
}
88
63
}
89
64
90
65
public void start () {
91
- if ( _mPlayer .isStreaming ()) {
66
+ if ( mPlayer .isStreaming ()) {
92
67
this .recording = true ;
93
- fileName = String .valueOf (new Date ().getTime ());
94
- _ambietAudio = defaultFolder + "/tmp_" + fileName + ".aac" ;
95
- _videoFile = defaultFolder + "/tmp_" + fileName + ".h264" ;
96
- _dvrFile = defaultFolder + "/DVR_" + fileName + ".mp4" ;
68
+ fileName = new SimpleDateFormat ("yyyy-MM-dd HH-mm-ss" )
69
+ .format (Calendar .getInstance ().getTime ());
70
+ ambietAudio = "/DigiView_" + fileName + ".aac" ;
71
+ videoFile ="/DigiView_" +fileName +".h264" ;
72
+ dvrFile = "/DigiView_" + fileName + ".mp4" ;
73
+
74
+ Log .d (DVR_LOG_TAG , "creating folder for dvr saving ..." );
75
+ File objFolder = new File (defaultFolder );
76
+ if (!objFolder .exists ())
77
+ objFolder .mkdir ();
78
+
97
79
98
80
Log .d (DVR_LOG_TAG , "start recording ..." );
99
- Toast .makeText (_activity , _activity .getText (R .string .recording_started ), Toast .LENGTH_LONG ).show ();
100
- ((ImageButton )_activity .findViewById (R .id .recordbt )).setImageResource (R .drawable .stop );
101
-
102
- ThreadPerTaskExecutor threadPerTaskExecutor = new ThreadPerTaskExecutor ();
103
- threadPerTaskExecutor .execute (() -> {
104
- Log .d (DVR_LOG_TAG , "creating folder for dvr saving ..." );
105
- File objFolder = new File (defaultFolder );
106
- if (!objFolder .exists ()){
107
- objFolder .mkdir ();
108
- }
81
+ streamDumper .init (videoFile , ambietAudio , dvrFile );
109
82
110
- dvrTmpFile = new File (_videoFile );
111
- if (_recordAmbientAudio ) {
112
- Log .d (DVR_LOG_TAG , "starting abient recording ..." );
113
- _recorder .setOutputFile (_ambietAudio );
114
- try {
115
- _recorder .prepare ();
116
- _recorder .start (); // Ambient Audio Recording is now started
117
- } catch (IOException e ) {
118
- e .printStackTrace ();
119
- }
83
+ Toast .makeText (activity , activity .getText (R .string .recording_started ), Toast .LENGTH_LONG ).show ();
84
+ ((ImageButton ) activity .findViewById (R .id .recordbt )).setImageResource (R .drawable .stop );
85
+
86
+
87
+
88
+ if (recordAmbientAudio ) {
89
+ Log .d (DVR_LOG_TAG , "starting ambient recording ..." );
90
+ recorder .setOutputFile (defaultFolder + ambietAudio );
91
+ try {
92
+ recorder .prepare ();
93
+ recorder .start (); // Ambient Audio Recording is now started
94
+ } catch (IOException e ) {
95
+ e .printStackTrace ();
120
96
}
121
- });
97
+ }
122
98
} else {
123
- Toast .makeText (_activity , "Stream not ready" , Toast .LENGTH_LONG ).show ();
99
+ Toast .makeText (activity , "Stream not ready" , Toast .LENGTH_LONG ).show ();
124
100
}
125
101
}
126
102
@@ -130,19 +106,18 @@ public boolean isRecording(){
130
106
131
107
public void stop () {
132
108
Log .d (DVR_LOG_TAG , "stop recording ..." );
133
- Toast .makeText (_activity , _activity .getText (R .string .recording_stopped ), Toast .LENGTH_LONG ).show ();
134
- ((ImageButton )_activity .findViewById (R .id .recordbt )).setImageResource (R .drawable .record );
135
-
136
- if (_recordAmbientAudio ) {
137
- _recorder .stop ();
109
+ Toast .makeText (activity , activity .getText (R .string .recording_stopped ), Toast .LENGTH_LONG ).show ();
110
+ ((ImageButton ) activity .findViewById (R .id .recordbt )).setImageResource (R .drawable .record );
138
111
139
- Toast .makeText (_activity , _activity .getString (R .string .dvr_merge_audio_video ), Toast .LENGTH_LONG ).show ();
140
- Mp4Muxer muxer = new Mp4Muxer (new File (_videoFile ), _ambietAudio , _dvrFile );
141
- muxer .start ();
142
- } else {
143
- new File (_videoFile ).renameTo ( new File (_dvrFile )); // No Ambient recording just dvr
112
+ if (recordAmbientAudio ) {
113
+ recorder .stop ();
114
+ try {
115
+ init (mPlayer );
116
+ } catch (IOException e ) {
117
+ e .printStackTrace ();
118
+ }
144
119
}
145
-
120
+ streamDumper . stop ();
146
121
this .recording = false ;
147
122
}
148
123
}
0 commit comments