Created
October 7, 2014 11:54
-
-
Save sayan801/9a39ccad0818d2b3499a to your computer and use it in GitHub Desktop.
Extract Audio from Video Using MediaMuxer
This file contains 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
private boolean cloneMediaUsingMuxer(String srcMedia, String dstMediaPath, | |
int expectedTrackCount, int degrees) throws IOException { | |
// Set up MediaExtractor to read from the source. | |
//AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMedia); | |
MediaExtractor extractor = new MediaExtractor(); | |
extractor.setDataSource(srcMedia); | |
int trackCount = extractor.getTrackCount(); | |
//assertEquals("wrong number of tracks", expectedTrackCount, trackCount); | |
// Set up MediaMuxer for the destination. | |
MediaMuxer muxer; | |
muxer = new MediaMuxer(dstMediaPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); | |
// Set up the tracks. | |
int audioTrackIndex = 0; | |
//HashMap<Integer, Integer> indexMap = new HashMap<Integer, Integer>(trackCount); | |
for (int i = 0; i < trackCount; i++) { | |
extractor.selectTrack(i); | |
MediaFormat format = extractor.getTrackFormat(i); | |
String COMPRESSED_AUDIO_FILE_MIME_TYPE = format.getString(MediaFormat.KEY_MIME); | |
if(COMPRESSED_AUDIO_FILE_MIME_TYPE.startsWith("audio/")) { | |
audioTrackIndex = muxer.addTrack(format); | |
} | |
//indexMap.put(i, dstIndex); | |
} | |
// Copy the samples from MediaExtractor to MediaMuxer. | |
boolean sawEOS = false; | |
int bufferSize = MAX_SAMPLE_SIZE; | |
int frameCount = 0; | |
int offset = 100; | |
ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize); | |
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); | |
if (degrees >= 0) { | |
muxer.setOrientationHint(degrees); | |
} | |
muxer.start(); | |
while (!sawEOS) { | |
bufferInfo.offset = offset; | |
bufferInfo.size = extractor.readSampleData(dstBuf, offset); | |
if (bufferInfo.size < 0) { | |
if (VERBOSE) { | |
Log.d(TAG, "saw input EOS."); | |
} | |
sawEOS = true; | |
bufferInfo.size = 0; | |
} else { | |
bufferInfo.presentationTimeUs = extractor.getSampleTime(); | |
bufferInfo.flags = extractor.getSampleFlags(); | |
int trackIndex = extractor.getSampleTrackIndex(); | |
if(audioTrackIndex == trackIndex ) { | |
muxer.writeSampleData(trackIndex, dstBuf, | |
bufferInfo); | |
} | |
extractor.advance(); | |
frameCount++; | |
if (VERBOSE) { | |
Log.d(TAG, "Frame (" + frameCount + ") " + | |
"PresentationTimeUs:" + bufferInfo.presentationTimeUs + | |
" Flags:" + bufferInfo.flags + | |
" TrackIndex:" + trackIndex + | |
" Size(KB) " + bufferInfo.size / 1024); | |
} | |
} | |
} | |
muxer.stop(); | |
muxer.release(); | |
//srcFd.close(); | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment