|
|
|
@ -4,6 +4,7 @@ import android.media.MediaCodec;
|
|
|
|
|
import android.media.MediaFormat;
|
|
|
|
|
import android.media.MediaMuxer;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
|
|
|
|
|
@ -14,6 +15,7 @@ import java.nio.ByteBuffer;
|
|
|
|
|
public class AndroidMuxer {
|
|
|
|
|
|
|
|
|
|
private final int mExpectedNumTracks = 1;
|
|
|
|
|
private MediaFormat mVideoFormat = null;
|
|
|
|
|
|
|
|
|
|
private MediaMuxer mMuxer;
|
|
|
|
|
|
|
|
|
@ -22,9 +24,19 @@ public class AndroidMuxer {
|
|
|
|
|
private volatile int mNumTracks;
|
|
|
|
|
private volatile int mNumReleases;
|
|
|
|
|
|
|
|
|
|
public AndroidMuxer(String outputPath) {
|
|
|
|
|
private long mStartRecordTime = 0L;
|
|
|
|
|
private static final long DEFAULT_RECORD_DURATION = 30 * 60 * 1000;
|
|
|
|
|
|
|
|
|
|
public AndroidMuxer() {
|
|
|
|
|
createMediaMuxer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void createMediaMuxer() {
|
|
|
|
|
try {
|
|
|
|
|
mMuxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
|
|
|
|
|
File output = CameraHelper.getOutputMediaFile(CameraHelper.MEDIA_TYPE_VIDEO, "");
|
|
|
|
|
String filePath = output.getAbsolutePath();
|
|
|
|
|
mMuxer = new MediaMuxer(filePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
|
|
|
|
|
mStarted = false;
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
@ -37,7 +49,7 @@ public class AndroidMuxer {
|
|
|
|
|
|
|
|
|
|
synchronized (mMuxer) {
|
|
|
|
|
int track = mMuxer.addTrack(trackFormat);
|
|
|
|
|
|
|
|
|
|
mVideoFormat = trackFormat;
|
|
|
|
|
if (++mNumTracks == mExpectedNumTracks) {
|
|
|
|
|
mMuxer.start();
|
|
|
|
|
mStarted = true;
|
|
|
|
@ -55,6 +67,20 @@ public class AndroidMuxer {
|
|
|
|
|
synchronized (mMuxer) {
|
|
|
|
|
mMuxer.writeSampleData(trackIndex, encodedData, bufferInfo);
|
|
|
|
|
}
|
|
|
|
|
if (mStartRecordTime <= 0L) {
|
|
|
|
|
mStartRecordTime = System.currentTimeMillis();
|
|
|
|
|
} else {
|
|
|
|
|
long recordTime = System.currentTimeMillis() - mStartRecordTime;
|
|
|
|
|
if (recordTime > DEFAULT_RECORD_DURATION) {
|
|
|
|
|
mMuxer.stop();
|
|
|
|
|
mMuxer.release();
|
|
|
|
|
|
|
|
|
|
mNumTracks = 0;
|
|
|
|
|
mStartRecordTime = 0L;
|
|
|
|
|
createMediaMuxer();
|
|
|
|
|
addTrack(mVideoFormat);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean release() {
|
|
|
|
|