import { BehaviorSubject, Observable } from 'rxjs';
import { NotificationService } from '../notification.service';
import { ChatClientService } from '../chat-client.service';
import { TranscoderService } from './transcoder.service';
import { MediaRecording } from '../types';
export type MediaRecorderConfig = Omit<MediaRecorderOptions, 'mimeType'> & Required<Pick<MediaRecorderOptions, 'mimeType'>>;
export declare enum MediaRecordingState {
    PAUSED = "paused",
    RECORDING = "recording",
    STOPPED = "stopped",
    ERROR = "error"
}
export type MediaRecordingTitleOptions = {
    mimeType: string;
};
export declare abstract class MultimediaRecorder<T = null> {
    protected notificationService: NotificationService;
    protected chatService: ChatClientService;
    private transcoder;
    abstract config: MediaRecorderConfig;
    customGenerateRecordingTitle: ((options: MediaRecordingTitleOptions) => string) | undefined;
    recordingState$: Observable<MediaRecordingState>;
    recording$: Observable<(MediaRecording & T) | undefined>;
    protected recordingSubject: BehaviorSubject<(MediaRecording & T) | undefined>;
    protected mediaRecorder: MediaRecorder | undefined;
    protected startTime: number | undefined;
    protected recordedChunkDurations: number[];
    private recordingStateSubject;
    constructor(notificationService: NotificationService, chatService: ChatClientService, transcoder: TranscoderService);
    get durationMs(): number;
    get mediaType(): string;
    get isRecording(): boolean;
    generateRecordingTitle: (mimeType: string) => string;
    makeRecording(blob: Blob): Promise<File | undefined>;
    handleErrorEvent: (e: Event) => void;
    handleDataavailableEvent: (e: BlobEvent) => void;
    get recordingState(): MediaRecordingState;
    start(): Promise<void>;
    pause(): void;
    resume(): void;
    stop(options?: {
        cancel: boolean;
    }): Promise<MediaRecording & T>;
    protected abstract enrichWithExtraData(): T;
    protected logError(error: Error): void;
}
