Skip to content

Instantly share code, notes, and snippets.

@a-chernykh
Created June 28, 2014 10:05
Show Gist options
  • Save a-chernykh/f27434a2127481ccd874 to your computer and use it in GitHub Desktop.
Save a-chernykh/f27434a2127481ccd874 to your computer and use it in GitHub Desktop.
public class JcodecMp4VideoMuxer implements VideoMuxer {
private FileChannelWrapper mChannelWrapper;
private MP4Muxer mMp4Muxer;
private FramesMP4MuxerTrack mMp4Track;
private ArrayList<ByteBuffer> mSpsList;
private ArrayList<ByteBuffer> mPpsList;
@Override
public boolean initialize() {
mSpsList = new ArrayList<ByteBuffer>();
mPpsList = new ArrayList<ByteBuffer>();
try {
mChannelWrapper = NIOUtils.writableFileChannel(getOutputFilePath());
mMp4Muxer = new MP4Muxer(mChannelWrapper, Brand.MP4);
mMp4Track = mMp4Muxer.addTrackForCompressed(TrackType.VIDEO,
getFrameRate());
// dump to disk every 2 seconds
mMp4Track.setTgtChunkDuration(new Rational(2, 1), Unit.SEC);
initialized = true;
return true;
} catch (IOException e) {
Crashlytics.logException(e);
e.printStackTrace();
}
return false;
}
void addFrame(@NotNull Frame frame) {
long timescale = getFrameRate();
ByteBuffer buffer = ByteBuffer.wrap(frame.getData());
H264Utils.encodeMOVPacket(buffer, mSpsList, mPpsList);
try {
frameNo++;
sumDuration += duration;
mMp4Track.addFrame(new MP4Packet(buffer,
frame.getPresentationTimeUs(),
timescale,
1,
frameNo,
frame.isSyncFrame(),
null,
frame.getPresentationTimeUs(), 0));
} catch (IOException e) {
e.printStackTrace();
}
}
boolean finalizeTrack() {
boolean success = true;
if (mSpsList.size() > 0 && mPpsList.size() > 0 && initialized) {
mMp4Track.addSampleEntry(H264Utils.createMOVSampleEntry(mSpsList, mPpsList));
try {
mMp4Muxer.writeHeader();
} catch (IOException e) {
success = false;
e.printStackTrace();
}
} else {
success = false;
}
NIOUtils.closeQuietly(mChannelWrapper);
try {
mChannelWrapper.close();
} catch (IOException e) {
success = false;
e.printStackTrace();
}
frameNo = 0;
initialized = false;
return success;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment