Created
June 28, 2014 10:05
-
-
Save a-chernykh/f27434a2127481ccd874 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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