Vidtreo
Exemplos

UI Personalizada

Construa sua própria interface de gravação de vídeo com hooks do VIDTREO.

UI Personalizada

Use o hook useVidtreoRecorder para construir interfaces de gravação completamente personalizadas.

Gravador Personalizado Completo

import { useVidtreoRecorder } from '@vidtreo/recorder-react';
import { useRef, useEffect } from 'react';

function CustomRecorder() {
  const videoRef = useRef<HTMLVideoElement>(null);

  const { state, actions, audioLevel } = useVidtreoRecorder({
    apiKey: import.meta.env.VITE_VIDTREO_API_KEY,
    countdownDuration: 3000,
    maxRecordingTime: 120000,
    onUploadComplete: (result) => {
      console.log('Vídeo pronto:', result.uploadUrl);
    },
  });

  useEffect(() => {
    if (videoRef.current && state.stream) {
      videoRef.current.srcObject = state.stream;
    }
  }, [state.stream]);

  useEffect(() => {
    actions.startPreview();
    return () => actions.cleanup();
  }, []);

  return (
    <div className="custom-recorder">
      {/* Prévia do vídeo */}
      <div className="video-container">
        <video ref={videoRef} autoPlay muted playsInline />

        {state.recordingState === 'recording' && (
          <div className="recording-indicator">
            <span className="rec-dot" />
            <span className="timer">{state.timer}</span>
          </div>
        )}

        {state.recordingState === 'countdown' && (
          <div className="countdown-overlay">
            <span className="countdown-number">{state.countdown}</span>
          </div>
        )}
      </div>

      {/* Medidor de áudio */}
      <div className="audio-meter">
        <div
          className="audio-level"
          style={{
            width: `${audioLevel * 100}%`,
            backgroundColor: audioLevel > 0.8 ? '#ef4444' : '#22c55e'
          }}
        />
      </div>

      {/* Controles */}
      <div className="controls">
        {state.recordingState === 'idle' && (
          <>
            <button onClick={() => actions.startRecording('camera')}>
              Gravar Câmera
            </button>
            <button onClick={() => actions.startRecording('screen')}>
              Gravar Tela
            </button>
          </>
        )}

        {state.recordingState === 'recording' && (
          <>
            <button onClick={() => actions.toggleMute()}>
              {state.isMuted ? 'Ativar Áudio' : 'Silenciar'}
            </button>
            <button onClick={() =>
              state.isPaused ? actions.resumeRecording() : actions.pauseRecording()
            }>
              {state.isPaused ? 'Retomar' : 'Pausar'}
            </button>
            <button onClick={() => actions.stopRecording()}>
              Parar
            </button>
          </>
        )}
      </div>

      {/* Seleção de dispositivos */}
      {state.recordingState === 'idle' && (
        <div className="device-selection">
          <select
            value={state.devices.selectedCamera || ''}
            onChange={(e) => actions.changeCamera(e.target.value)}
          >
            {state.devices.cameras.map((camera) => (
              <option key={camera.deviceId} value={camera.deviceId}>
                {camera.label || 'Câmera'}
              </option>
            ))}
          </select>

          <select
            value={state.devices.selectedMic || ''}
            onChange={(e) => actions.changeMic(e.target.value)}
          >
            {state.devices.microphones.map((mic) => (
              <option key={mic.deviceId} value={mic.deviceId}>
                {mic.label || 'Microfone'}
              </option>
            ))}
          </select>
        </div>
      )}

      {/* Progresso do upload */}
      {state.uploadProgress !== null && (
        <div className="upload-progress">
          Enviando: {Math.round(state.uploadProgress * 100)}%
        </div>
      )}

      {state.error && <div className="error">{state.error}</div>}
    </div>
  );
}

Exemplo Mínimo

function MinimalRecorder() {
  const { state, actions } = useVidtreoRecorder({
    apiKey: import.meta.env.VITE_VIDTREO_API_KEY,
  });

  return (
    <div>
      <video
        ref={(el) => el && state.stream && (el.srcObject = state.stream)}
        autoPlay
        muted
      />
      <button
        onClick={() =>
          state.recordingState === 'idle'
            ? actions.startRecording()
            : actions.stopRecording()
        }
      >
        {state.recordingState === 'idle' ? 'Gravar' : 'Parar'}
      </button>
    </div>
  );
}

Próximos Passos

Nesta página