下面列出了怎么用android.media.MediaExtractor的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* @param codec
* @param extractor
* @param inputBuffers
* @param presentationTimeUs
* @param isAudio
*/
protected boolean internal_process_input(final MediaCodec codec, final MediaExtractor extractor, final ByteBuffer[] inputBuffers, final long presentationTimeUs, final boolean isAudio) {
// if (DEBUG) Log.v(TAG, "internalProcessInput:presentationTimeUs=" + presentationTimeUs);
boolean result = true;
while (mIsRunning) {
final int inputBufIndex = codec.dequeueInputBuffer(TIMEOUT_USEC);
if (inputBufIndex == MediaCodec.INFO_TRY_AGAIN_LATER)
break;
if (inputBufIndex >= 0) {
final int size = extractor.readSampleData(inputBuffers[inputBufIndex], 0);
if (size > 0) {
codec.queueInputBuffer(inputBufIndex, 0, size, presentationTimeUs, 0);
}
result = extractor.advance(); // return false if no data is available
break;
}
}
return result;
}
@TargetApi(16)
private int selectTrack(MediaExtractor extractor, boolean audio) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (audio) {
if (mime.startsWith("audio/")) {
return i;
}
} else {
if (mime.startsWith("video/")) {
return i;
}
}
}
return -5;
}
/**
* @param media_extractor
* @param trackIndex
* @return
*/
protected MediaCodec internalStartVideo(final MediaExtractor media_extractor, final int trackIndex) {
if (DEBUG) Log.v(TAG, "internalStartVideo:");
MediaCodec codec = null;
if (trackIndex >= 0) {
final MediaFormat format = media_extractor.getTrackFormat(trackIndex);
final String mime = format.getString(MediaFormat.KEY_MIME);
try {
codec = MediaCodec.createDecoderByType(mime);
codec.configure(format, mOutputSurface, null, 0);
codec.start();
} catch (final IOException e) {
Log.w(TAG, e);
codec = null;
}
if (DEBUG) Log.v(TAG, "internalStartVideo:codec started");
}
return codec;
}
public static TrackResult getFirstVideoAndAudioTrack(MediaExtractor extractor) {
TrackResult trackResult = new TrackResult();
trackResult.mVideoTrackIndex = -1;
trackResult.mAudioTrackIndex = -1;
int trackCount = extractor.getTrackCount();
for (int i = 0; i < trackCount; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (trackResult.mVideoTrackIndex < 0 && mime.startsWith("video/")) {
trackResult.mVideoTrackIndex = i;
trackResult.mVideoTrackMime = mime;
trackResult.mVideoTrackFormat = format;
} else if (trackResult.mAudioTrackIndex < 0 && mime.startsWith("audio/")) {
trackResult.mAudioTrackIndex = i;
trackResult.mAudioTrackMime = mime;
trackResult.mAudioTrackFormat = format;
}
if (trackResult.mVideoTrackIndex >= 0 && trackResult.mAudioTrackIndex >= 0) break;
}
if (trackResult.mVideoTrackIndex < 0 || trackResult.mAudioTrackIndex < 0) {
throw new IllegalArgumentException("extractor does not contain video and/or audio tracks.");
}
return trackResult;
}
@TargetApi(16)
private int selectTrack(MediaExtractor extractor, boolean audio) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (audio) {
if (mime.startsWith("audio/")) {
return i;
}
} else {
if (mime.startsWith("video/")) {
return i;
}
}
}
return -5;
}
/**
* search first track index matched specific MIME
* @param extractor
* @param mimeType "video/" or "audio/"
* @return track index, -1 if not found
*/
protected static final int selectTrack(final MediaExtractor extractor, final String mimeType) {
final int numTracks = extractor.getTrackCount();
MediaFormat format;
String mime;
for (int i = 0; i < numTracks; i++) {
format = extractor.getTrackFormat(i);
mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith(mimeType)) {
if (DEBUG) {
Log.d(TAG_STATIC, "Extractor selected track " + i + " (" + mime + "): " + format);
}
return i;
}
}
return -1;
}
private int drainExtractor(long timeoutUs) {
if (mIsExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = mExtractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != mTrackIndex) {
return DRAIN_STATE_NONE;
}
final int result = mDecoder.dequeueInputBuffer(timeoutUs);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
mIsExtractorEOS = true;
mDecoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
final int sampleSize = mExtractor.readSampleData(mDecoderBuffers.getInputBuffer(result), 0);
final boolean isKeyFrame = (mExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
mDecoder.queueInputBuffer(result, 0, sampleSize, mExtractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
mExtractor.advance();
return DRAIN_STATE_CONSUMED;
}
private int drainExtractor(long timeoutUs) {
if (mIsExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = mExtractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != mTrackIndex) {
return DRAIN_STATE_NONE;
}
final int result = mDecoder.dequeueInputBuffer(timeoutUs);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
mIsExtractorEOS = true;
mDecoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
final int sampleSize = mExtractor.readSampleData(mDecoderBuffers.getInputBuffer(result), 0);
final boolean isKeyFrame = (mExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
mDecoder.queueInputBuffer(result, 0, sampleSize, mExtractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
mExtractor.advance();
return DRAIN_STATE_CONSUMED;
}
private int drainExtractor() {
if (isExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = mediaExtractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != this.trackIndex) {
return DRAIN_STATE_NONE;
}
int result = decoder.dequeueInputBuffer(0);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
isExtractorEOS = true;
decoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
int sampleSize = mediaExtractor.readSampleData(decoderInputBuffers[result], 0);
boolean isKeyFrame = (mediaExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
decoder.queueInputBuffer(result, 0, sampleSize, mediaExtractor.getSampleTime() / timeScale, isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
mediaExtractor.advance();
return DRAIN_STATE_CONSUMED;
}
private int drainExtractor(long timeoutUs) {
if (isExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = extractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != this.trackIndex) {
return DRAIN_STATE_NONE;
}
final int result = decoder.dequeueInputBuffer(timeoutUs);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
isExtractorEOS = true;
decoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
final int sampleSize = extractor.readSampleData(decoderBuffers.getInputBuffer(result), 0);
final boolean isKeyFrame = (extractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
decoder.queueInputBuffer(result, 0, sampleSize, extractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
extractor.advance();
return DRAIN_STATE_CONSUMED;
}
/**
* @param sourceFile
* @return first video track index, -1 if not found
*/
protected int internalPrepareVideo(final String sourceFile) {
int trackIndex = -1;
mVideoMediaExtractor = new MediaExtractor();
try {
mVideoMediaExtractor.setDataSource(sourceFile);
trackIndex = selectTrack(mVideoMediaExtractor, "video/");
if (trackIndex >= 0) {
mVideoMediaExtractor.selectTrack(trackIndex);
final MediaFormat format = mVideoMediaExtractor.getTrackFormat(trackIndex);
mVideoWidth = format.getInteger(MediaFormat.KEY_WIDTH);
mVideoHeight = format.getInteger(MediaFormat.KEY_HEIGHT);
mDuration = format.getLong(MediaFormat.KEY_DURATION);
if (DEBUG) Log.v(TAG, String.format("format:size(%d,%d),duration=%d,bps=%d,framerate=%f,rotation=%d",
mVideoWidth, mVideoHeight, mDuration, mBitrate, mFrameRate, mRotation));
}
} catch (final IOException e) {
Log.w(TAG, e);
}
return trackIndex;
}
public static TrackResult getFirstVideoAndAudioTrack(MediaExtractor extractor) {
TrackResult trackResult = new TrackResult();
trackResult.mVideoTrackIndex = -1;
trackResult.mAudioTrackIndex = -1;
int trackCount = extractor.getTrackCount();
for (int i = 0; i < trackCount; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (trackResult.mVideoTrackIndex < 0 && mime.startsWith("video/")) {
trackResult.mVideoTrackIndex = i;
trackResult.mVideoTrackMime = mime;
trackResult.mVideoTrackFormat = format;
} else if (trackResult.mAudioTrackIndex < 0 && mime.startsWith("audio/")) {
trackResult.mAudioTrackIndex = i;
trackResult.mAudioTrackMime = mime;
trackResult.mAudioTrackFormat = format;
}
if (trackResult.mVideoTrackIndex >= 0 && trackResult.mAudioTrackIndex >= 0) break;
}
if (trackResult.mVideoTrackIndex < 0 || trackResult.mAudioTrackIndex < 0) {
throw new IllegalArgumentException("extractor does not contain video and/or audio tracks.");
}
return trackResult;
}
public void open(String path) throws IOException {
close();
pause = false;
stop = false;
seekRequestedToMs = -1;
currentPresentationTimeMs = 0;
extractor = new MediaExtractor();
extractor.setDataSource(path);
if (initWithTrackOfInterest("video/") == false) {
throw new IOException("Can't open video file. Unsupported video format.");
}
if (codec == null) {
throw new IOException("Can't open video file. Unsupported video format.");
}
pause();
videoThread = new VideoThread();
videoThread.start();
}
/**
* @param media_extractor
* @param trackIndex
* @return
*/
protected MediaCodec internalStartAudio(final MediaExtractor media_extractor, final int trackIndex) {
if (DEBUG) Log.v(TAG, "internalStartAudio:");
MediaCodec codec = null;
if (trackIndex >= 0) {
final MediaFormat format = media_extractor.getTrackFormat(trackIndex);
final String mime = format.getString(MediaFormat.KEY_MIME);
try {
codec = MediaCodec.createDecoderByType(mime);
codec.configure(format, null, null, 0);
codec.start();
if (DEBUG) Log.v(TAG, "internalStartAudio:codec started");
//
final ByteBuffer[] buffers = codec.getOutputBuffers();
int sz = buffers[0].capacity();
if (sz <= 0)
sz = mAudioInputBufSize;
if (DEBUG) Log.v(TAG, "AudioOutputBufSize:" + sz);
mAudioOutTempBuf = new byte[sz];
} catch (final IOException e) {
Log.w(TAG, e);
codec = null;
}
}
return codec;
}
private int drainExtractor(long timeoutUs) {
if (isExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = extractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != this.trackIndex) {
return DRAIN_STATE_NONE;
}
final int result = decoder.dequeueInputBuffer(timeoutUs);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
isExtractorEOS = true;
decoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
final int sampleSize = extractor.readSampleData(decoder.getInputBuffer(result), 0);
final boolean isKeyFrame = (extractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
decoder.queueInputBuffer(result, 0, sampleSize, extractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_KEY_FRAME : 0);
extractor.advance();
numTracks ++ ;
return DRAIN_STATE_CONSUMED;
}
public void initStream() throws Exception {
mLock.lock();
try {
mExtractor = new MediaExtractor();
if (!TextUtils.isEmpty(mPath)) {
mExtractor.setDataSource(mPath);
} else if (mUri != null) {
mExtractor.setDataSource(mContext, mUri, null);
} else {
throw new IOException();
}
} catch (Exception e) {//IOException
throw e;
} finally {
mLock.unlock();
}
initConfig();
}
private int selectTrack(MediaExtractor extractor, boolean audio) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (audio) {
if (mime.startsWith("audio/")) {
return i;
}
} else {
if (mime.startsWith("video/")) {
return i;
}
}
}
return -5;
}
@TargetApi( Build.VERSION_CODES.JELLY_BEAN )
public static int GetMediaFormatPropertyInteger( Uri uri, String key, int defaultValue ) {
int value = defaultValue;
MediaExtractor extractor = new MediaExtractor();
try {
extractor.setDataSource( uri.toString() );
} catch ( IOException e ) {
e.printStackTrace();
return value;
}
MediaFormat format = GetTrackFormat( extractor, MIME_TYPE_AVC );
extractor.release();
if ( format.containsKey( key ) ) {
value = format.getInteger( key );
}
return value;
}
/**
* Selects the video track, if any.
*
* @return the track index, or -1 if no video track is found.
*/
private static int selectTrack(MediaExtractor extractor) {
// Select the first video track we find, ignore the rest.
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/")) {
if (VERBOSE) {
Log.d(TAG, "Extractor selected track " + i + " (" + mime + "): " + format);
}
return i;
}
}
return -1;
}
/**
* search first track index matched specific MIME
* @param extractor
* @param mimeType "video/" or "audio/"
* @return track index, -1 if not found
*/
protected static final int selectTrack(final MediaExtractor extractor, final String mimeType) {
final int numTracks = extractor.getTrackCount();
MediaFormat format;
String mime;
for (int i = 0; i < numTracks; i++) {
format = extractor.getTrackFormat(i);
mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith(mimeType)) {
if (DEBUG) {
Log.d(TAG_STATIC, "Extractor selected track " + i + " (" + mime + "): " + format);
}
return i;
}
}
return -1;
}
private int drainExtractor(long timeoutUs) {
if (mIsExtractorEOS) return DRAIN_STATE_NONE;
int trackIndex = mExtractor.getSampleTrackIndex();
if (trackIndex >= 0 && trackIndex != mTrackIndex) {
return DRAIN_STATE_NONE;
}
final int result = mDecoder.dequeueInputBuffer(timeoutUs);
if (result < 0) return DRAIN_STATE_NONE;
if (trackIndex < 0) {
mIsExtractorEOS = true;
mDecoder.queueInputBuffer(result, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
return DRAIN_STATE_NONE;
}
final int sampleSize = mExtractor.readSampleData(mDecoderBuffers.getInputBuffer(result), 0);
final boolean isKeyFrame = (mExtractor.getSampleFlags() & MediaExtractor.SAMPLE_FLAG_SYNC) != 0;
mDecoder.queueInputBuffer(result, 0, sampleSize, mExtractor.getSampleTime(), isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
mExtractor.advance();
return DRAIN_STATE_CONSUMED;
}
public static int findTrack(MediaExtractor extractor, boolean audio) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (audio) {
if (mime.startsWith("audio/")) {
return i;
}
} else {
if (mime.startsWith("video/")) {
return i;
}
}
}
return -5;
}
/**
* @param codec
* @param extractor
* @param inputBuffers
* @param presentationTimeUs
* @param isAudio
*/
protected boolean internal_process_input(final MediaCodec codec, final MediaExtractor extractor, final ByteBuffer[] inputBuffers, final long presentationTimeUs, final boolean isAudio) {
// if (DEBUG) Log.v(TAG, "internal_process_input:presentationTimeUs=" + presentationTimeUs);
boolean result = true;
while (mIsRunning) {
final int inputBufIndex = codec.dequeueInputBuffer(TIMEOUT_USEC);
if (inputBufIndex == MediaCodec.INFO_TRY_AGAIN_LATER)
break;
if (inputBufIndex >= 0) {
final int size = extractor.readSampleData(inputBuffers[inputBufIndex], 0);
if (size > 0) {
codec.queueInputBuffer(inputBufIndex, 0, size, presentationTimeUs, 0);
}
result = extractor.advance(); // return false if no data is available
break;
}
}
return result;
}
public static int selectTrack(MediaExtractor extractor, boolean audio) {
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (audio) {
if (mime.startsWith("audio/")) {
return i;
}
} else {
if (mime.startsWith("video/")) {
return i;
}
}
}
return -5;
}
public static Pair<Integer, Integer> getVideoFrameCount(String input) throws IOException {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(input);
int trackIndex = VideoUtil.selectTrack(extractor, false);
extractor.selectTrack(trackIndex);
int keyFrameCount = 0;
int frameCount = 0;
while (true) {
int flags = extractor.getSampleFlags();
if (flags > 0 && (flags & MediaExtractor.SAMPLE_FLAG_SYNC) != 0) {
keyFrameCount++;
}
long sampleTime = extractor.getSampleTime();
if (sampleTime < 0) {
break;
}
frameCount++;
extractor.advance();
}
extractor.release();
return new Pair<>(keyFrameCount, frameCount);
}
public static float getAveFrameRate(VideoProcessor.MediaSource mediaSource) throws IOException {
MediaExtractor extractor = new MediaExtractor();
mediaSource.setDataSource(extractor);
int trackIndex = VideoUtil.selectTrack(extractor, false);
extractor.selectTrack(trackIndex);
long lastSampleTimeUs = 0;
int frameCount = 0;
while (true) {
long sampleTime = extractor.getSampleTime();
if (sampleTime < 0) {
break;
} else {
lastSampleTimeUs = sampleTime;
}
frameCount++;
extractor.advance();
}
extractor.release();
return frameCount / (lastSampleTimeUs / 1000f / 1000f);
}
/**
* @param media_extractor
* @param trackIndex
* @return
*/
protected MediaCodec internal_start_audio(final MediaExtractor media_extractor, final int trackIndex) {
if (DEBUG) Log.v(TAG, "internal_start_audio:");
MediaCodec codec = null;
if (trackIndex >= 0) {
final MediaFormat format = media_extractor.getTrackFormat(trackIndex);
final String mime = format.getString(MediaFormat.KEY_MIME);
try {
codec = MediaCodec.createDecoderByType(mime);
codec.configure(format, null, null, 0);
codec.start();
if (DEBUG) Log.v(TAG, "internal_start_audio:codec started");
//
final ByteBuffer[] buffers = codec.getOutputBuffers();
int sz = buffers[0].capacity();
if (sz <= 0)
sz = mAudioInputBufSize;
if (DEBUG) Log.v(TAG, "AudioOutputBufSize:" + sz);
mAudioOutTempBuf = new byte[sz];
} catch (final IOException e) {
Log.w(TAG, e);
}
}
return codec;
}
/**
* search first track index matched specific MIME
* @param extractor
* @param mimeType "video/" or "audio/"
* @return track index, -1 if not found
*/
protected static final int selectTrack(final MediaExtractor extractor, final String mimeType) {
final int numTracks = extractor.getTrackCount();
MediaFormat format;
String mime;
for (int i = 0; i < numTracks; i++) {
format = extractor.getTrackFormat(i);
mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith(mimeType)) {
if (DEBUG) {
Log.d(TAG_STATIC, "Extractor selected track " + i + " (" + mime + "): " + format);
}
return i;
}
}
return -1;
}
/**
* 调整aac音量
*
* @param volume [0,100]
* @throws IOException
*/
public static void adjustAacVolume(Context context, VideoProcessor.MediaSource aacSource, String outPath, int volume
, @Nullable VideoProgressListener listener) throws IOException {
String name = "temp_aac_"+System.currentTimeMillis();
File pcmFile = new File(VideoUtil.getVideoCacheDir(context), name + ".pcm");
File pcmFile2 = new File(VideoUtil.getVideoCacheDir(context), name + "_2.pcm");
File wavFile = new File(VideoUtil.getVideoCacheDir(context), name + ".wav");
AudioUtil.decodeToPCM(aacSource, pcmFile.getAbsolutePath(), null, null);
AudioUtil.adjustPcmVolume(pcmFile.getAbsolutePath(), pcmFile2.getAbsolutePath(), volume);
MediaExtractor extractor = new MediaExtractor();
aacSource.setDataSource(extractor);
int trackIndex = VideoUtil.selectTrack(extractor, true);
MediaFormat aacFormat = extractor.getTrackFormat(trackIndex);
int sampleRate = aacFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
int oriChannelCount = aacFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
if (oriChannelCount == 2) {
channelConfig = AudioFormat.CHANNEL_IN_STEREO;
}
new PcmToWavUtil(sampleRate, channelConfig, oriChannelCount, AudioFormat.ENCODING_PCM_16BIT).pcmToWav(pcmFile2.getAbsolutePath(), wavFile.getAbsolutePath());
AudioUtil.encodeWAVToAAC(wavFile.getPath(), outPath, aacFormat, listener);
}
public static boolean isStereo(String aacPath) throws IOException {
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(aacPath);
MediaFormat format = null;
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; i++) {
format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("audio/")) {
break;
}
}
extractor.release();
if (format == null) {
return false;
}
return format.getInteger(MediaFormat.KEY_CHANNEL_COUNT) > 1;
}