コード例 #1
0
  public void handleWriteSampleData(
      MediaCodec encoder,
      int trackIndex,
      int bufferIndex,
      ByteBuffer encodedData,
      MediaCodec.BufferInfo bufferInfo) {
    super.writeSampleData(encoder, trackIndex, bufferIndex, encodedData, bufferInfo);

    if (((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0)) {
      if (VERBOSE) Log.i(TAG, "handling BUFFER_FLAG_CODEC_CONFIG for track " + trackIndex);
      if (trackIndex == mVideoTrackIndex) {
        // Capture H.264 SPS + PPS Data
        Log.d(TAG, "Capture SPS + PPS");

        captureH264MetaData(encodedData, bufferInfo);
        mFFmpeg.setVideoCodecExtraData(videoConfig, videoConfig.length);
      } else {
        captureAACMetaData(encodedData, bufferInfo);

        Log.d(TAG, "AUDIO CONFIG LENGTH: " + audioConfig.length);
        mFFmpeg.setAudioCodecExtraData(audioConfig, audioConfig.length);
      }
      if (videoConfig != null && audioConfig != null) {
        getConfig().setMuxerState(EncodingConfig.MUXER_STATE.CONNECTING);
        mFFmpeg.writeHeader();
      }
      releaseOutputBufer(encoder, encodedData, bufferIndex, trackIndex);
      return;
    }

    if (trackIndex == mAudioTrackIndex && formatRequiresADTS()) {
      addAdtsToByteBuffer(encodedData, bufferInfo);
    }

    // adjust the ByteBuffer values to match BufferInfo (not needed?)
    encodedData.position(bufferInfo.offset);
    encodedData.limit(bufferInfo.offset + bufferInfo.size);

    bufferInfo.presentationTimeUs = getNextRelativePts(bufferInfo.presentationTimeUs, trackIndex);

    if (!allTracksAdded()) {
      if (trackIndex == mVideoTrackIndex) {
        Log.d(TAG, "RECEIVED VIDEO DATA NOT ALL TRACKS ADDED");
      } else {
        Log.d(TAG, "RECEIVED AUDIO DATA NOT ALL TRACKS ADDED");
      }
    }
    if (!allTracksFinished() && allTracksAdded()) {
      boolean isVideo = trackIndex == mVideoTrackIndex;
      if (isVideo && ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0)) {
        getConfig().setMuxerState(EncodingConfig.MUXER_STATE.STREAMING);
        Log.d(TAG, "WRITING VIDEO KEYFRAME");
        packageH264Keyframe(encodedData, bufferInfo);

        mFFmpeg.writePacket(
            mH264Keyframe,
            bufferInfo.size + mH264MetaSize,
            bufferInfo.presentationTimeUs,
            cBoolean(isVideo),
            cBoolean(true));
      } else {
        Log.d(TAG, "WRITING " + (isVideo ? "VIDEO" : "AUDIO") + " DATA");
        mFFmpeg.writePacket(
            encodedData,
            bufferInfo.size,
            bufferInfo.presentationTimeUs,
            cBoolean(isVideo),
            cBoolean(false));
      }
    }
    releaseOutputBufer(encoder, encodedData, bufferIndex, trackIndex);

    if (allTracksFinished()) {
      shutdown();
    }
  }