类android.media.MediaExtractor源码实例Demo

下面列出了怎么用android.media.MediaExtractor的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: AudioVideoPlayerSample   文件: MediaMoviePlayer.java
/**
	 * @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;
	}
 
源代码2 项目: SiliCompressor   文件: MediaController.java
@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;
}
 
源代码3 项目: AudioVideoPlayerSample   文件: MediaMoviePlayer.java
/**
 * @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;
}
 
源代码4 项目: Pix-Art-Messenger   文件: MediaExtractorUtils.java
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;
}
 
源代码5 项目: deltachat-android   文件: VideoRecoder.java
@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;
}
 
源代码6 项目: AudioVideoPlayerSample   文件: MediaMoviePlayer.java
/**
 * 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;
}
 
源代码7 项目: android-transcoder   文件: AudioTrackTranscoder.java
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;
}
 
源代码8 项目: phoenix   文件: AudioTrackTranscoder.java
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;
}
 
源代码9 项目: GPUVideo-android   文件: VideoComposer.java
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;
}
 
源代码10 项目: GPUVideo-android   文件: RemixAudioComposer.java
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;
}
 
源代码11 项目: AudioVideoPlayerSample   文件: MediaVideoPlayer.java
/**
 * @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;
}
 
源代码12 项目: phoenix   文件: MediaExtractorUtils.java
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;
}
 
源代码13 项目: media-for-mobile   文件: VideoPlayer.java
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();
}
 
源代码14 项目: AudioVideoPlayerSample   文件: MediaMoviePlayer.java
/**
 * @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;
}
 
源代码15 项目: Mp4Composer-android   文件: RemixAudioComposer.java
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;
}
 
源代码16 项目: K-Sonic   文件: Track.java
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();
}
 
源代码17 项目: PhotoMovie   文件: AudioRecordThread.java
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;
}
 
源代码18 项目: AndroidVideoSamples   文件: MediaHelper.java
@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;
}
 
源代码19 项目: pause-resume-video-recording   文件: MoviePlayer.java
/**
 * 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;
}
 
源代码20 项目: AudioVideoPlayerSample   文件: MediaVideoPlayer.java
/**
 * 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;
}
 
源代码21 项目: Pix-Art-Messenger   文件: AudioTrackTranscoder.java
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;
}
 
源代码22 项目: Telegram-FOSS   文件: MediaController.java
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;
}
 
源代码23 项目: libcommon   文件: MediaMoviePlayer.java
/**
	 * @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;
	}
 
源代码24 项目: VideoProcessor   文件: VideoUtil.java
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;
}
 
源代码25 项目: VideoProcessor   文件: VideoUtil.java
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);
}
 
源代码26 项目: VideoProcessor   文件: VideoUtil.java
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);
}
 
源代码27 项目: libcommon   文件: MediaMoviePlayer.java
/**
 * @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;
}
 
源代码28 项目: libcommon   文件: MediaMoviePlayer.java
/**
 * 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;
}
 
源代码29 项目: VideoProcessor   文件: AudioUtil.java
/**
 * 调整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);
}
 
源代码30 项目: VideoProcessor   文件: AudioUtil.java
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;
}
 
 类所在包
 同包方法