import Stream from './Stream';
import Privileges from '../../util/Privileges';
import { ReportThreshold } from '../../type/type';
import { VloudStream } from '../../type/stream';
import { LocalStreamStats, ReportStats } from '../../type/stats';
import { AudioProfile, ScreenProfile, TrackType, VideoProfile } from '../../type/value';
import { StreamCodecOption, StreamDeviceOption, StreamPlayOption, LocalStream as LocalStreamInterface } from '../../type/BRTCStream';
export default class LocalStream extends Stream implements LocalStreamInterface {
    streamDeviceOption: StreamDeviceOption;
    streamCodecOption: StreamCodecOption;
    private videoProfile;
    private audioProfile;
    private screenProfile;
    protected stream: VloudStream | undefined;
    /**
    * 本地权限
    */
    private privileges;
    /**
     * 创建本地流实例
     *
     * @param options 配置项
     * @returns 本地流实例
     */
    constructor(options: StreamDeviceOption, id?: string);
    /**
     * 根据分辨率约束码率
     */
    private constraintBitrate;
    /**
     * @internal
     * @param privileges
     */
    setPrivileges(privileges: Privileges | null): void;
    /**
     * 是否是屏幕分享流
     *
     * @returns
     */
    isScreenStream(): boolean;
    /**
     * 设置视频 profile
     * 该方法需要在调用 init() 之前调用。
     *
     * @param profile
     */
    setVideoProfile(profile: VideoProfile): void;
    /**
     * 设置屏幕分享 profile
     * 该方法需要在调用 init() 之前调用。
     * @param profile
     */
    setScreenProfile(profile: ScreenProfile): void;
    /**
     * 设置音频 profile
     * 该方法需要在调用 init() 之前调用。
     * @internal
     * @param profile
     */
    setAudioProfile(profile: AudioProfile): void;
    /**
     * 设置自定义视频编码配置
     * 该方法可以根据需要灵活设置本地流的视频分辨率、帧率和码率。
     * 该方法需要在调用 init() 之前调用。
     *
     * @param options 配置项
     */
    setVideoEncoderConfiguration(options: StreamCodecOption): void;
    /**
     * 获取音频带宽
     *
     * @returns
     * 音频带宽
     */
    getAudioBandwidth(): any;
    /**
     * 初始化 LocalStream 实例
     * @returns
     */
    init(): Promise<any>;
    /**
     * 添加音频或视频轨道
     * 调用该方法将音频或视频轨道添加到本地流，若该本地流已经被发布，则会自动更新发往远端的音视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * 请注意，一个 Stream 对象中最多只能同时包含一路音频轨道和一路视频轨道。如果你想要更换同类型的轨道，请使用 replaceTrack()。
     * 新的音视频轨道可以通过 createStream()/getAudioTrack()|getVideoTrack() 获取， 或者直接通过 getUserMedia()、captureStream() 获取。
     *
     * @param track 媒体轨道
     * @internal
     * @returns
     */
    addTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 移除视频轨道
     * 调用该方法会移除本地流中的视频轨道，若本地流已经被发布，则会自动更新发往远端的视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * 请注意，一个已经发布的Stream对象中至少要有一个媒体轨道，如果你想完全删除本地流中的音视频轨道，请直接通过 unpublish() 取消发布， 然后再通过 close() 关闭本地流。
     *
     * @param track 媒体轨道
     * @internal
     * @returns
     */
    removeTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 更换音频或视频轨道
     * 调用该方法更换本地流中的同类型轨道，若本地流已经被发布，该方法会自动更新发往远端的音视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * 新的音视频轨道可以通过 createStream()/getAudioTrack()|getVideoTrack() 获取， 或者直接通过 getUserMedia()、captureStream() 获取。
     * 如果需要更换媒体输入设备，推荐使用 switchDevice()。
     * 在更换视频轨道时，要求视频分辨率跟 setVideoProfile() 设置保持一致，否则会抛出异常
     * 支持 Chrome 65+、Safari 浏览器
     *
     * @param track 媒体轨道
     * @returns
     */
    replaceTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 切换媒体输入设备
     * 调用该方法可更换本地流的媒体输入设备
     *
     * @internal
     * @param type 切换类型
     * @param deviceId
     * @returns
     */
    switchDevice(type: TrackType, deviceId: string): Promise<any>;
    /**
     * 播放本地流
     *
     * @param videoId 挂载 dom
     * @param options 播放选项
     *
     * @returns
     */
    play(videoId: string | HTMLDivElement, options?: StreamPlayOption): Promise<any>;
    /**
     * 获取流的传输信息
     *
     * @returns
     */
    getStats(): Promise<LocalStreamStats>;
    /**
     * 获取流的上传信息
     * @internal
     * @returns
     */
    getReportStats(reportThreshold: ReportThreshold): Promise<ReportStats>;
    getExtraReport(): {
        event: number;
        audio_stutter: number;
        video_stutter: number;
        blockOp: number;
    };
}
