Android Webrtc записывает видео из Локального потока - PullRequest
0 голосов
/ 03 марта 2019

Привет, я пытаюсь записать местный аудио и видео поток. Может ли кто-нибудь помочь мне в этом.Для записи видео я попытался захватить с onPreviewFrame, но выходной файл имеет только зеленые линии. Это то, что я пробовал в Camera1Session.java файле.Для записи звука я не получил никакой идеи.Любая помощь благодарна.

   private void listenForBytebufferFrames() {
camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback() {
  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
  @Override
  public void onPreviewFrame(final byte[] data, android.hardware.Camera callbackCamera) {
    checkIsOnCameraThread();




    if (callbackCamera != camera) {
      Logging.e(TAG, "Callback from a different camera. This should never happen.");
      return;
    }

    if (state != SessionState.RUNNING) {
      Logging.d(TAG, "Bytebuffer frame captured but camera is no longer running.");
      return;
    }

    final long captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());

    if (!firstFrameReported) {
      final int startTimeMs =
              (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - constructionTimeNs);
      camera1StartTimeMsHistogram.addSample(startTimeMs);
      firstFrameReported = true;
    }

    VideoFrame.Buffer frameBuffer = new NV21Buffer(
            data, captureFormat.width, captureFormat.height, () -> cameraThreadHandler.post(() -> {
      if (state == SessionState.RUNNING) {
        camera.addCallbackBuffer(data);
      }
    }));

    final VideoFrame frame = new VideoFrame(frameBuffer, getFrameOrientation(), captureTimeNs);
    events.onFrameCaptured(Camera1Session.this, frame);

    frame.release();

// modifi

    final VideoFrame.Buffer buffer = frame.getBuffer();

    // If the frame is rotated, it will be applied after cropAndScale. Therefore, if the frame is
    // rotated by 90 degrees, swap width and height.
    final int targetWidth = frame.getRotation() % 180 == 0 ? w : h;
    final int targetHeight = frame.getRotation() % 180 == 0 ? h : w;

    final float frameAspectRatio = (float) buffer.getWidth() / (float) buffer.getHeight();
    final float fileAspectRatio = (float) targetWidth / (float) targetHeight;

    // Calculate cropping to equalize the aspect ratio.
    int cropWidth = buffer.getWidth();
    int cropHeight = buffer.getHeight();
    if (fileAspectRatio > frameAspectRatio) {
      cropHeight = (int) (cropHeight * (frameAspectRatio / fileAspectRatio));
    } else {
      cropWidth = (int) (cropWidth * (fileAspectRatio / frameAspectRatio));
    }

    final int cropX = (buffer.getWidth() - cropWidth) / 2;
    final int cropY = (buffer.getHeight() - cropHeight) / 2;

    final VideoFrame.Buffer scaledBuffer =
            buffer.cropAndScale(cropX, cropY, cropWidth, cropHeight, targetWidth, targetHeight);
    frame.release();

    final VideoFrame.I420Buffer i420 = scaledBuffer.toI420();
    scaledBuffer.release();


      YuvHelper.I420Rotate(i420.getDataY(), i420.getStrideY(), i420.getDataU(), i420.getStrideU(),
              i420.getDataV(), i420.getStrideV(), outputFrameBuffer, i420.getWidth(), i420.getHeight(),
              frame.getRotation());
      i420.release();

      try {
        videoOutFile.write("FRAME\n".getBytes(Charset.forName("US-ASCII")));
        videoOutFile.write(
                outputFrameBuffer.array(), outputFrameBuffer.arrayOffset(), outputFrameSize);
        Logging.d(TAG,
                "Camera1Session" +  outputFrameBuffer.array() );
      } catch (IOException e) {
        throw new RuntimeException("Error writing video to disk", e);
      }
    frameCount++;







  }
});





 }
...