public void setDataSource(MediaSource source) throws IOException { mVideoExtractor = source.getVideoExtractor(); mAudioExtractor = source.getAudioExtractor(); mVideoTrackIndex = -1; mAudioTrackIndex = -1; for (int i = 0; i < mVideoExtractor.getTrackCount(); ++i) { MediaFormat format = mVideoExtractor.getTrackFormat(i); Log.d(TAG, format.toString()); String mime = format.getString(MediaFormat.KEY_MIME); if (mVideoTrackIndex < 0 && mime.startsWith("video/")) { mVideoExtractor.selectTrack(i); mVideoTrackIndex = i; mVideoFormat = format; mVideoMinPTS = mVideoExtractor.getSampleTime(); } else if (mAudioExtractor == null && mAudioTrackIndex < 0 && mime.startsWith("audio/")) { mVideoExtractor.selectTrack(i); mAudioTrackIndex = i; mAudioFormat = format; mAudioMinPTS = mVideoExtractor.getSampleTime(); } } if (mAudioExtractor != null) { for (int i = 0; i < mAudioExtractor.getTrackCount(); ++i) { MediaFormat format = mAudioExtractor.getTrackFormat(i); Log.d(TAG, format.toString()); String mime = format.getString(MediaFormat.KEY_MIME); if (mAudioTrackIndex < 0 && mime.startsWith("audio/")) { mAudioExtractor.selectTrack(i); mAudioTrackIndex = i; mAudioFormat = format; mAudioMinPTS = mAudioExtractor.getSampleTime(); } } } if (mVideoFormat == null) { throw new IOException("no video track found"); } else { if (mAudioFormat == null) { Log.i(TAG, "no audio track found"); } if (mPlaybackThread == null) { if (mSurface == null) { Log.i(TAG, "no video output surface specified"); } mPlaybackThread = new PlaybackThread(); mPlaybackThread.start(); } } }