import Privileges from '../util/Privileges';
import { BloudClient, TencentClient } from './client';
import { AudioProfile, ScreenProfile, TrackType, UserId, VideoProfile } from './value';
import { TencentStream, VloudStream } from './stream';
import { Collection } from './type';
declare type VideoHint = '' | 'motion' | 'detail' | 'text';
declare type AudioHint = '' | 'speech' | 'speech-recognition' | 'music';
/**
 * 创建本地流配置项
 */
export interface StreamDeviceOption {
    /**
     * 是否有视频
     */
    video?: boolean;
    /**
     * 是否有音频
     */
    audio?: boolean;
    /**
     * 是否是屏幕分享
     */
    screen?: boolean;
    /**
     * 麦克风设备标识
     */
    microphoneId?: string;
    /**
     * 摄像头设备标识
     */
    cameraId?: string;
    /**
     * 自定义音频源
     */
    audioSource?: MediaStreamTrack;
    /**
     * 自定义视频源
     */
    videoSource?: MediaStreamTrack;
    /**
    * 是否开启回声消除
    */
    echoCancellation?: boolean;
    autoGainControl?: boolean;
    noiseSuppression?: boolean;
    videoHint?: VideoHint;
    /**
     * 自适应策略
     * <https://www.w3.org/TR/mst-content-hint/#audio-content-hints>
     */
    audioHint?: AudioHint;
    sourceType?: string;
}
export interface StreamPlayOption {
    /**
     * video fit 类型
     */
    fit?: 'cover' | 'contain';
    /**
     * 静音播放
     */
    muted?: boolean;
    /**
     * 水平旋转
     */
    rotateX?: number;
    /**
     * 垂直旋转
     */
    rotateY?: number;
    backgroundColor?: string;
    audio?: boolean;
}
/**
 * LocalStream stats 接口
 */
export interface LocalStreamStats {
    /**
     * 视频丢包数
     */
    videoPacketsLost?: number;
    /**
     * 音频丢包数
     */
    audioPacketsLost?: number;
    /**
     * 视频发送字节数
     */
    videoBytesSent?: number;
    /**
     * 视频包发送数
     */
    videoPacketsSent?: number;
    /**
     * 音频发送字节数
     */
    audioBytesSent?: number;
    /**
     * 音频包发送数
     */
    audioPacketsSent?: number;
    /**
     * 视频宽度
     */
    width?: number;
    /**
     * 视频高度
     */
    height?: number;
    /**
     * rtt 网络延时
     */
    rtt?: number;
    /**
     * 编码帧数
     */
    framesEncoded?: number;
    /**
     * 发送帧数
     */
    framesSent?: number;
}
/**
 * RemoteStream stats 接口
 */
export interface RemoteStreamStats {
    /**
     * 视频丢包数
     */
    videoPacketsLost?: number;
    /**
     * 音频丢包数
     */
    audioPacketsLost?: number;
    /**
     * 视频接收字节数
     */
    videoBytesReceived?: number;
    /**
     * 音频包接收数
     */
    videoPacketsReceived?: number;
    /**
     * 音频接收字节数
     */
    audioBytesReceived?: number;
    /**
     * 音频包接收数
     */
    audioPacketsReceived?: number;
    /**
     * 视频宽度
     */
    width?: number;
    /**
     * 视频高度
     */
    height?: number;
    /**
     * rtt 网络延时
     */
    rtt?: number;
    /**
     * 解码帧数
     */
    framesDecoded?: number;
}
export interface StreamCodecOption {
    /**
     * 视频宽度
     */
    width?: number | null;
    /**
     * 视频高度
     */
    height?: number | null;
    /**
     * 视频帧率
     */
    frameRate?: number;
    /**
     * 音频码率
     */
    /**
     * 视频码率
     */
    bitrate?: number;
}
export declare abstract class Stream {
    /**
     * 本地流标识
     */
    static readonly STREAM_TYPE_LOCAL = 0;
    /**
     * 远端流标识
     */
    static readonly STREAM_TYPE_REMOTE = 1;
    /**
     * 创建流实例
     *
     * @param type 流类型
     * @param uid 用户 id
     * @param unumber 用户 number
     * @param webrtcType webrtc 底层类型
     * @param stream 底层流对象
     * @returns Stream
     */
    constructor(type: number, sid?: string, uid?: number, webrtcType?: number, stream?: any, subStream?: any);
    /**
     * 判断是否是本地流
     *
     * @returns boolean
     */
    isLocalStream(): boolean;
    /**
     * 是否是屏幕分享流
     *
     * @returns boolean
     */
    isScreenStream(): boolean;
    /**
     * 流是否正在播放
     *
     * @returns boolean
     */
    isPlaying(): boolean;
    /**
     * 获取 userId
     *
     * @returns number
     */
    getUserId(): any;
    /**
     * 获取 stream id
     *
     * @returns string
     */
    getStreamId(): string;
    setClient(client: BloudClient | TencentClient): void;
    setCollection(collection: Collection): void;
    setUserId(uid: UserId): void;
    /**
     * 获取底层流实例
     * @returns VloudStream
     */
    getStream(): VloudStream | TencentStream;
    /**
     * 是否有视频
     *
     * @returns boolean
     */
    hasVideo(): boolean;
    /**
     * 是否有音频
     *
     * @returns boolean
     */
    hasAudio(): boolean;
    /**
     * 获取流视频是否挂起
     *
     * @returns boolean
     */
    getVideoOn(): boolean;
    /**
     * 获取流音频是否挂起
     *
     * @returns boolean
     */
    getAudioOn(): boolean;
    /**
     * 音频轨道
     */
    get audioTrack(): MediaStreamTrack | undefined;
    /**
     * 视频轨道
     */
    get videoTrack(): MediaStreamTrack | undefined;
    /**
     * 获取音频轨道
     *
     * @returns MediaStreamTrack
     */
    getAudioTrack(): MediaStreamTrack | undefined;
    /**
     * 获取视频轨道
     *
     * @returns MediaStreamTrack
     */
    getVideoTrack(): MediaStreamTrack | undefined;
    /**
     * 获取 MediaStream 实例
     *
     * @returns MediaStream
     */
    getMediaStream(): MediaStream | undefined;
    /**
     * 禁用视频轨道
     *
     * - 对于本地流，调用该方法会停止发送视频，远端会触发 Client.on('mute-video') 事件
     * - 如果视频是从摄像头采集，此时摄像头灯仍然是亮着的。若想完全禁用视频轨道(即关闭摄像头)
     * - 可以使用 removeTrack() 删除视频轨道然后调用 MediaStreamTrack.stop() 关闭视频轨道（关闭摄像头）
     * - 对于远端流，调用该方法会停止播放视频，但是仍然接收视频数据。
     *
     * @returns boolean 是否成功
     */
    muteVideo(): Promise<boolean>;
    /**
     * 启用视频轨道
     *
     * - 对于本地流，调用该方法会触发远端 Client.on('unmute-video') 事件。
     * - 视频轨道默认是开启的，若你调用 muteVideo() 后可用该方法重新启用视频。
     *
     * @returns boolean 是否成功
     */
    unmuteVideo(): Promise<boolean>;
    /**
     * 禁用音频轨道
     *
     * - 对于本地流，调用该方法会停止发送音频，远端会触发 Client.on('mute-audio') 事件。
     * - 对于远端流，调用该方法会停止播放音频，但是仍然接收音频数据。
     *
     * @returns boolean 是否成功
     */
    muteAudio(): Promise<boolean>;
    /**
     * 启用音频轨道
     *
     * - 对于本地流，调用该方法会触发远端 Client.on('unmute-audio') 事件。
     * - 音频轨道默认是开启的，若你调用 muteAudio() 后可用该方法重新启用音频。
     *
     * @returns boolean 是否成功
     */
    unmuteAudio(): Promise<boolean>;
    /**
     * 播放流
     *
     * @param videoId 挂载 dom
     * @param options 播放选项
     *
     * @returns any
     */
    play(videoId: string | HTMLDivElement, options?: StreamPlayOption): Promise<any>;
    /**
     * 重新播放流
     *
     * @returns any
     */
    replay(): Promise<void>;
    /**
     * 恢复播放音视频
     *
     * - 在某些版本浏览器上移动传入 play() 的 div 容器可能会导致音视频播放器进入 ‘PAUSED’ 状态，此时 需要调用该接口恢复播放。
     * - 由于浏览器自动播放策略的限制，在 play() 返回 PLAY_NOT_ALLOWED 错误后需要引导用户通过手势 调用该接口恢复播放
     *
     * @returns any
     */
    resume(): Promise<any>;
    /**
     * 停止播放流
     *
     * @returns void
     */
    stop(): void;
    /**
     * 销毁音视频流
     *
     * @returns void
     */
    destroy(): void;
    /**
     * 获取流的麦克风音量
     *
     * @returns number
     */
    getAudioLevel(): number;
    /**
     * 提交事件
     *
     * @param type 事件类型
     * @param data 事件数据
     *
     * @returns void
     */
    fire(type: string, data?: any): void;
    /**
     * 设置事件监听
     * 支持链式调用
     * 支持命名空间 `type.namespace`，使用 `.` 来分隔 `type` 和 `namespace`
     *
     * @param type 事件类型
     * @param listener 监听函数
     *
     * @returns Stream
     */
    on(type: 'video-track-ended', listener: typeof stream_event_video_track_ended): this;
    on(type: 'video-track-mute', listener: typeof stream_event_video_track_mute): this;
    on(type: 'video-track-unmute', listener: typeof stream_event_video_track_unmute): this;
    on(type: 'audio-track-ended', listener: typeof stream_event_audio_track_ended): this;
    on(type: 'audio-track-mute', listener: typeof stream_event_audio_track_mute): this;
    on(type: 'audio-track-unmute', listener: typeof stream_event_audio_track_unmute): this;
    on(type: 'track-update', listener: typeof stream_event_track_update): this;
    on(type: 'player-state-changed', listener: typeof stream_event_player_state_changed): this;
    on(type: 'connect-error', listener: typeof stream_event_connect_error): this;
    on(type: string, listener: Function): this;
    /**
     * 设置一次事件监听
     * 支持链式调用
     * 支持命名空间 `type.namespace`，使用 `.` 来分隔 `type` 和 `namespace`
     *
     * @param type 事件类型
     * @param listener 监听函数
     *
     * @returns Stream
     */
    one(type: 'video-track-ended', listener: typeof stream_event_video_track_ended): this;
    one(type: 'video-track-mute', listener: typeof stream_event_video_track_mute): this;
    one(type: 'video-track-unmute', listener: typeof stream_event_video_track_unmute): this;
    one(type: 'audio-track-ended', listener: typeof stream_event_audio_track_ended): this;
    one(type: 'audio-track-mute', listener: typeof stream_event_audio_track_mute): this;
    one(type: 'audio-track-unmute', listener: typeof stream_event_audio_track_unmute): this;
    one(type: 'track-update', listener: typeof stream_event_track_update): this;
    one(type: 'player-state-changed', listener: typeof stream_event_player_state_changed): this;
    one(type: 'connect-error', listener: typeof stream_event_connect_error): this;
    one(type: string, listener: Function): this;
    /**
     * 取消事件监听
     * 支持链式调用
     *
     * @param type 事件类型或者命名空间
     * - 如果传入命名空间则解绑此命名空间的所有回调
     * - 如果不传则解绑所有设置过的回调
     * @param listener 绑定函数
     * - 如果不传则解绑指定 `type` 的所有回调，否则只解绑指定 `type` 和 `listener` 的回调
     *
     * @returns Stream
     */
    off(type?: string, listener?: Function): this;
    /**
     * 获取当前播放的扬声器设备 id
     *
     * @returns string
     */
    getAudioDeviceId(): string;
    /**
     * 获取当前播放音量
     *
     * @returns number
     */
    getAudioVolume(): number;
    /**
     * 截取当前流的一帧视频数据（base64 png），该方法需要在 play() 后调用，并且 Stream 中有视频流才有效
     *
     * @returns string
     */
    getVideoFrame(): string;
    /**
     * 获取流的传输信息
     */
    abstract getStats(): Promise<LocalStreamStats | RemoteStreamStats>;
}
/**
 * 本地流对象
 */
export declare class LocalStream extends Stream {
    streamCodecOption: StreamCodecOption;
    streamDeviceOption: StreamDeviceOption;
    /**
     * 创建本地流实例
     *
     * @param options 配置项
     *
     * @returns 本地流实例
     */
    constructor(options: StreamDeviceOption, id?: string);
    /**
     * 是否是屏幕分享流
     *
     * @returns boolean
     */
    isScreenStream(): boolean;
    getAudioBandwidth(): any;
    setPrivileges(privileges: Privileges): void;
    /**
     * 设置视频 profile
     *
     * - 该方法需要在调用 init() 之前调用。
     *
     * @param profile
     *
     * @returns void
     */
    setVideoProfile(profile: VideoProfile): void;
    /**
     * 设置屏幕分享 profile
     *
     * - 该方法需要在调用 init() 之前调用。
     *
     * @param profile
     *
     * @returns void
     */
    setScreenProfile(profile: ScreenProfile): void;
    /**
     * 设置音频 profile
     *
     * @description 该方法需要在调用 init() 之前调用。
     *
     * @param profile
     *
     * @returns void
     */
    setAudioProfile(profile: AudioProfile): void;
    /**
     * 设置自定义视频编码配置
     *
     * - 该方法可以根据需要灵活设置本地流的视频分辨率、帧率和码率。
     * - 该方法需要在调用 init() 之前调用。
     *
     * @param options 配置项
     *
     * @returns void
     */
    setVideoEncoderConfiguration(options: StreamCodecOption): void;
    /**
     * 初始化 LocalStream 实例
     *
     * @returns any
     */
    init(): Promise<any>;
    /**
     * 添加音频或视频轨道
     *
     * - 调用该方法将音频或视频轨道添加到本地流，若该本地流已经被发布，则会自动更新发往远端的音视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * - 请注意，一个 Stream 对象中最多只能同时包含一路音频轨道和一路视频轨道。如果你想要更换同类型的轨道，请使用 replaceTrack()。
     * - 新的音视频轨道可以通过 createStream()/getAudioTrack()|getVideoTrack() 获取， 或者直接通过 getUserMedia()、captureStream() 获取。
     *
     * @param track 媒体轨道
     *
     * @returns any
     */
    addTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 移除视频轨道
     *
     * - 调用该方法会移除本地流中的视频轨道，若本地流已经被发布，则会自动更新发往远端的视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * - 请注意，一个已经发布的Stream对象中至少要有一个媒体轨道，如果你想完全删除本地流中的音视频轨道，请直接通过 unpublish() 取消发布， 然后再通过 close() 关闭本地流。
     *
     * @param track 媒体轨道
     *
     * @returns any
     */
    removeTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 更换音频或视频轨道
     *
     * - 调用该方法更换本地流中的同类型轨道，若本地流已经被发布，该方法会自动更新发往远端的音视频流，此时远端会收到 Client.on('stream-updated') 事件通知。
     * - 新的音视频轨道可以通过 createStream()/getAudioTrack()|getVideoTrack() 获取， 或者直接通过 getUserMedia()、captureStream() 获取。
     * - 如果需要更换媒体输入设备，推荐使用 switchDevice()。
     * - 在更换视频轨道时，要求视频分辨率跟 setVideoProfile() 设置保持一致，否则会抛出异常
     * - 支持 Chrome 65+、Safari 浏览器
     *
     * @param track 媒体轨道
     *
     * @returns any
     */
    replaceTrack(track: MediaStreamTrack): Promise<any>;
    /**
     * 切换媒体输入设备
     *
     * - 调用该方法可更换本地流的媒体输入设备
     *
     * @param type 切换类型
     * @param deviceId
     *
     * @returns any
     */
    switchDevice(type: TrackType, deviceId: string): Promise<any>;
    /**
     * 播放本地流
     *
     * @param videoId 挂载 dom
     * @param options 播放选项
     *
     * @returns any
     */
    play(videoId: string | HTMLDivElement, options?: StreamPlayOption): Promise<any>;
    /**
     * 获取流的传输信息
     *
     * @returns LocalStreamStats
     */
    getStats(): Promise<LocalStreamStats>;
}
/**
 * 远端流对象
 */
export declare class RemoteStream extends Stream {
    /**
     * 创建远端流
     *
     * @param uid 用户 id
     * @param unumber 用户 number
     * @param webrtcType 底层类型
     * @param stream 底层流
     *
     * @returns RemoteStream
     */
    constructor(uid: number, webrtcType?: number, stream?: any, subStream?: any, sid?: string);
    /**
     * 是否已订阅流
     *
     * @returns boolean
     */
    isSubscribed(): boolean;
    onSubscribe(client: any): any;
    isUnpublish(): boolean;
    onUnsubscribe(): any;
    /**
     * 设置输出扬声器设备
     *
     * @param deviceId 扬声器标识
     *
     * @returns any
     */
    setAudioOutput(deviceId: string): Promise<any>;
    /**
     * 设置播放音量
     *
     * @param volume 播放音量
     * - 取值范围：[0, 1]
     * - 默认 1
     * @returns any
     */
    setAudioVolume(volume: number): void;
    /**
     * 播放远端流
     *
     * @param videoId 挂载 dom
     * @param options 播放选项
     *
     * @returns any
     */
    play(videoId: string | HTMLDivElement, options?: StreamPlayOption): Promise<any>;
    /**
     * 获取流的传输信息
     *
     * @returns RemoteStreamStats
     */
    getStats(): Promise<RemoteStreamStats>;
}
/**
 *
 * @returns void
 */
declare function stream_event_video_track_ended(): void;
/**
 *
 * @returns void
 */
declare function stream_event_audio_track_ended(): void;
/**
 *
 * @returns void
 */
declare function stream_event_video_track_mute(): void;
/**
 *
 * @returns void
 */
declare function stream_event_audio_track_mute(): void;
/**
 *
 * @returns void
 */
declare function stream_event_video_track_unmute(): void;
/**
 *
 * @returns void
 */
declare function stream_event_audio_track_unmute(): void;
/**
 * track 更新
 *
 * @param event Object
 * - type track 类型
 * - track 更新 track
 *
 * @returns void
 */
declare function stream_event_track_update(event: {
    type: TrackType;
    track: MediaStreamTrack;
}): void;
/**
 * Audio/Video Player 状态变化事件 App 可根据状态变化来更新 UI，比如，通过监听 video player 状态变化来关闭或打开遮板
 * ```javascript
 * stream.on('player-state-changed', (event) => {
 *   console.log(`${event.type} player is ${event.state} because of ${event.reason}`);
 *  });
 * ```
 */
export declare const PLAYER_STATE_CHANGED = "player-state-changed";
/**
 * 播放状态改变
 *
 * @param event Object
 * - type track 类型
 * - state 播放状态
 * - reason 原因
 *
 * @returns void
 */
declare function stream_event_player_state_changed(event: {
    type: TrackType;
    state: 'PAUSE' | 'PLAYING' | 'STOPPED';
    reason: string;
}): void;
/**
 * pc 连接失败
 *
 * @returns void
 */
declare function stream_event_connect_error(): void;
export {};
