Skip to content

Commit 5dc1671

Browse files
committed
improve record start time
1 parent 76fa8c4 commit 5dc1671

12 files changed

+40
-49
lines changed

library/src/main/java/com/pedro/library/base/Camera1Base.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,9 @@ public void startRecord(@NonNull final String path, @Nullable RecordController.L
388388
throws IOException {
389389
RecordController.RecordTracks tracks = audioInitialized ?
390390
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
391+
recordController.setRequestKeyFrame(this::requestKeyFrame);
391392
recordController.startRecord(path, listener, tracks);
392-
if (!streaming) {
393-
startEncoders();
394-
} else if (videoEncoder.isRunning()) {
395-
requestKeyFrame();
396-
}
393+
if (!streaming) startEncoders();
397394
}
398395

399396
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@@ -412,12 +409,9 @@ public void startRecord(@NonNull final FileDescriptor fd,
412409
@Nullable RecordController.Listener listener) throws IOException {
413410
RecordController.RecordTracks tracks = audioInitialized ?
414411
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
412+
recordController.setRequestKeyFrame(this::requestKeyFrame);
415413
recordController.startRecord(fd, listener, tracks);
416-
if (!streaming) {
417-
startEncoders();
418-
} else if (videoEncoder.isRunning()) {
419-
requestKeyFrame();
420-
}
414+
if (!streaming) startEncoders();
421415
}
422416

423417
@RequiresApi(api = Build.VERSION_CODES.O)
@@ -669,6 +663,7 @@ public void startStreamAndRecord(String url, String path, RecordController.Liste
669663
startStream(url);
670664
RecordController.RecordTracks tracks = audioInitialized ?
671665
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
666+
recordController.setRequestKeyFrame(this::requestKeyFrame);
672667
recordController.startRecord(path, listener, tracks);
673668
}
674669

library/src/main/java/com/pedro/library/base/Camera2Base.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -431,12 +431,9 @@ public void startRecord(@NonNull String path, @Nullable RecordController.Listene
431431
throws IOException {
432432
RecordController.RecordTracks tracks = audioInitialized ?
433433
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
434+
recordController.setRequestKeyFrame(this::requestKeyFrame);
434435
recordController.startRecord(path, listener, tracks);
435-
if (!streaming) {
436-
startEncoders();
437-
} else if (videoEncoder.isRunning() || videoEncoderRecord.isRunning()) {
438-
requestKeyFrame();
439-
}
436+
if (!streaming) startEncoders();
440437
}
441438

442439
public void startRecord(@NonNull final String path) throws IOException {
@@ -454,12 +451,9 @@ public void startRecord(@NonNull final FileDescriptor fd,
454451
@Nullable RecordController.Listener listener) throws IOException {
455452
RecordController.RecordTracks tracks = audioInitialized ?
456453
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
454+
recordController.setRequestKeyFrame(this::requestKeyFrame);
457455
recordController.startRecord(fd, listener, tracks);
458-
if (!streaming) {
459-
startEncoders();
460-
} else if (videoEncoder.isRunning() || videoEncoderRecord.isRunning()) {
461-
requestKeyFrame();
462-
}
456+
if (!streaming) startEncoders();
463457
}
464458

465459
@RequiresApi(api = Build.VERSION_CODES.O)
@@ -623,6 +617,7 @@ public void startStreamAndRecord(String url, String path, RecordController.Liste
623617
startStream(url);
624618
RecordController.RecordTracks tracks = audioInitialized ?
625619
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
620+
recordController.setRequestKeyFrame(this::requestKeyFrame);
626621
recordController.startRecord(path, listener, tracks);
627622
}
628623

library/src/main/java/com/pedro/library/base/DisplayBase.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,9 @@ public void startRecord(@NonNull String path, @Nullable RecordController.Listene
301301
throws IOException {
302302
RecordController.RecordTracks tracks = audioInitialized ?
303303
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
304+
recordController.setRequestKeyFrame(this::requestKeyFrame);
304305
recordController.startRecord(path, listener, tracks);
305-
if (!streaming) {
306-
startEncoders(resultCode, data, mediaProjectionCallback);
307-
} else if (videoEncoder.isRunning()) {
308-
requestKeyFrame();
309-
}
306+
if (!streaming) startEncoders(resultCode, data, mediaProjectionCallback);
310307
}
311308

312309
public void startRecord(@NonNull final String path) throws IOException {
@@ -324,12 +321,9 @@ public void startRecord(@NonNull final FileDescriptor fd,
324321
@Nullable RecordController.Listener listener) throws IOException {
325322
RecordController.RecordTracks tracks = audioInitialized ?
326323
RecordController.RecordTracks.ALL : RecordController.RecordTracks.VIDEO;
324+
recordController.setRequestKeyFrame(this::requestKeyFrame);
327325
recordController.startRecord(fd, listener, tracks);
328-
if (!streaming) {
329-
startEncoders(resultCode, data, mediaProjectionCallback);
330-
} else if (videoEncoder.isRunning()) {
331-
requestKeyFrame();
332-
}
326+
if (!streaming) startEncoders(resultCode, data, mediaProjectionCallback);
333327
}
334328

335329
@RequiresApi(api = Build.VERSION_CODES.O)

library/src/main/java/com/pedro/library/base/FromFileBase.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -329,12 +329,9 @@ public void startRecord(@NonNull String path, @Nullable RecordController.Listene
329329
RecordController.RecordTracks tracks = RecordController.RecordTracks.ALL;
330330
if (!videoEnabled) tracks = RecordController.RecordTracks.AUDIO;
331331
else if (!audioEnabled) tracks = RecordController.RecordTracks.VIDEO;
332+
recordController.setRequestKeyFrame(this::requestKeyFrame);
332333
recordController.startRecord(path, listener, tracks);
333-
if (!streaming) {
334-
startEncoders();
335-
} else if (videoEncoder.isRunning()) {
336-
requestKeyFrame();
337-
}
334+
if (!streaming) startEncoders();
338335
}
339336

340337
public void startRecord(@NonNull final String path) throws IOException {
@@ -352,12 +349,9 @@ public void startRecord(@NonNull final FileDescriptor fd, @Nullable RecordContro
352349
RecordController.RecordTracks tracks = RecordController.RecordTracks.ALL;
353350
if (!videoEnabled) tracks = RecordController.RecordTracks.AUDIO;
354351
else if (!audioEnabled) tracks = RecordController.RecordTracks.VIDEO;
352+
recordController.setRequestKeyFrame(this::requestKeyFrame);
355353
recordController.startRecord(fd, listener, tracks);
356-
if (!streaming) {
357-
startEncoders();
358-
} else if (videoEncoder.isRunning()) {
359-
requestKeyFrame();
360-
}
354+
if (!streaming) startEncoders();
361355
}
362356

363357
@RequiresApi(api = Build.VERSION_CODES.O)

library/src/main/java/com/pedro/library/base/OnlyAudioBase.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,7 @@ public boolean prepareAudio() {
145145
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
146146
public void startRecord(String path, RecordController.Listener listener) throws IOException {
147147
recordController.startRecord(path, listener, RecordController.RecordTracks.AUDIO);
148-
if (!streaming) {
149-
startEncoders();
150-
}
148+
if (!streaming) startEncoders();
151149
}
152150

153151
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@@ -165,9 +163,7 @@ public void startRecord(final String path) throws IOException {
165163
public void startRecord(@NonNull final FileDescriptor fd,
166164
@Nullable RecordController.Listener listener) throws IOException {
167165
recordController.startRecord(fd, listener, RecordController.RecordTracks.AUDIO);
168-
if (!streaming) {
169-
startEncoders();
170-
}
166+
if (!streaming) startEncoders();
171167
}
172168

173169
@RequiresApi(api = Build.VERSION_CODES.O)

library/src/main/java/com/pedro/library/base/StreamBase.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,12 @@ abstract class StreamBase(
265265
val usedTracks = tracks ?: if (videoSource is NoVideoSource) RecordController.RecordTracks.AUDIO
266266
else if (audioSource is NoAudioSource) RecordController.RecordTracks.VIDEO
267267
else RecordController.RecordTracks.ALL
268-
recordController.startRecord(path, listener, usedTracks)
269-
if (!isStreaming) startSources()
270-
else {
268+
recordController.setRequestKeyFrame {
271269
videoEncoder.requestKeyframe()
272270
videoEncoderRecord.requestKeyframe()
273271
}
272+
recordController.startRecord(path, listener, usedTracks)
273+
if (!isStreaming) startSources()
274274
}
275275

276276
/**

library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public abstract class BaseRecordController implements RecordController {
4141
protected BitrateManager bitrateManager;
4242
protected volatile long startTs = 0;
4343
protected RecordTracks tracks = RecordTracks.ALL;
44+
protected RequestKeyFrame requestKeyFrame = null;
45+
46+
public void setRequestKeyFrame(RequestKeyFrame requestKeyFrame) {
47+
this.requestKeyFrame = requestKeyFrame;
48+
}
4449

4550
public void setVideoCodec(VideoCodec videoCodec) {
4651
this.videoCodec = videoCodec;

library/src/main/java/com/pedro/library/base/recording/RecordController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ default void onError(Exception e) {
4949
}
5050
}
5151

52+
interface RequestKeyFrame {
53+
void onRequestKeyFrame();
54+
}
55+
5256
enum Status {
5357
STARTED, STOPPED, RECORDING, PAUSED, RESUMED
5458
}

library/src/main/java/com/pedro/library/util/AacMuxerRecordController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public void stopRecord() {
9595
} catch (Exception ignored) { } finally {
9696
outputStream = null;
9797
}
98+
requestKeyFrame = null;
9899
if (listener != null) listener.onStatusChange(status);
99100
}
100101

library/src/main/java/com/pedro/library/util/AndroidMuxerRecordController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,20 @@ public void stopRecord() {
9999
pauseMoment = 0;
100100
pauseTime = 0;
101101
startTs = 0;
102+
requestKeyFrame = null;
102103
if (listener != null) listener.onStatusChange(status);
103104
}
104105

105106
@Override
106107
public void recordVideo(ByteBuffer videoBuffer, MediaCodec.BufferInfo videoInfo) {
107108
if (status == Status.STARTED && videoFormat != null && (audioFormat != null || tracks == RecordTracks.VIDEO)) {
108109
if (videoInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME || isKeyFrame(videoBuffer)) {
110+
requestKeyFrame = null;
109111
videoTrack = mediaMuxer.addTrack(videoFormat);
110112
init();
113+
} else if (requestKeyFrame != null) {
114+
requestKeyFrame.onRequestKeyFrame();
115+
requestKeyFrame = null;
111116
}
112117
} else if (status == Status.RESUMED && (videoInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME
113118
|| isKeyFrame(videoBuffer))) {

0 commit comments

Comments
 (0)