public class MediaCodecUtil1 {
private String mFilePath;
private MediaCodec mMediaCodec;
private MediaExtractor mMediaExtractor;
private Surface mSurface;
private boolean mIsAvailable;
private ByteBuffer[] mInputBuffers;
private ByteBuffer[] mOutputBuffers;
public MediaCodecUtil1(String filePath, Surface surface) {
mFilePath = filePath;
mSurface = surface;
}
private void init() {
mIsAvailable = false;
mMediaExtractor = new MediaExtractor();
try {
mMediaExtractor.setDataSource(mFilePath);
int trackCount = mMediaExtractor.getTrackCount();
for (int i = ; i < trackCount; i++) {
MediaFormat mediaFormat = mMediaExtractor.getTrackFormat(i);
String mime = mediaFormat.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
mMediaExtractor.selectTrack(i);
mMediaCodec = MediaCodec.createDecoderByType(mime);
mMediaCodec.configure(mediaFormat, mSurface, null, );
mIsAvailable = true;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
init();
if (mIsAvailable) {
mMediaCodec.start();
mInputBuffers = mMediaCodec.getInputBuffers();
mOutputBuffers = mMediaCodec.getOutputBuffers();
new Thread(new EncoderThread()).start();
}
}
private class EncoderThread implements Runnable {
@Override
public void run() {
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
long startTime = System.currentTimeMillis();
while (mIsAvailable) {
int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-);
if (inputBufferIndex >= ) {
ByteBuffer inputBuffer = mInputBuffers[inputBufferIndex];
inputBuffer.clear();
int sampleSize = mMediaExtractor.readSampleData(inputBuffer, );
if (sampleSize > ) {
mMediaExtractor.advance();
mMediaCodec.queueInputBuffer(inputBufferIndex, , sampleSize, mMediaExtractor.getSampleTime(), );
}
}
int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, );
if (outputBufferIndex >= ) {
long sleepTime = bufferInfo.presentationTimeUs / - (System.currentTimeMillis() - startTime);
if (sleepTime > ) {
SystemClock.sleep(sleepTime);
}
ByteBuffer outBuffer = mOutputBuffers[outputBufferIndex];
mMediaCodec.releaseOutputBuffer(outputBufferIndex, true);
}
}
mMediaExtractor.release();
mMediaCodec.stop();
mMediaCodec.release();
Log.i("==", "播放完成");
}
}
public void stop() {
mIsAvailable = false;
}
}